项目场景:按照相同关键字归类整合成新数组。
例如:按照学生的班级(class)和队名(team)为关键组合,将相同匹配数据的成员(member)归纳到一起
json:
arr:[
{class:"a",team:"hero",member:[{name:"Tom",hobby:"足球"}]}
{class:"b",team:"spider",member:[{name:"Amy",hobby:"旅游"}]}
{class:"c",team:"star",member:[{name:"Crise",hobby:"爬山"}]}
{class:"a",team:"hero",member:[{name:"Lili",hobby:"画画"}]}
]
问题一:真实项目中,class和team不止案例中的三种,且组合多种多样。怎样使用循环将数据中的member合并
问题二:在循环处理数据的过程中,发现元数据也发生了改变,而在js语句中并无改变源数组的方法
问题一:
subOption(){
let subArr = [];//要提交的数据
let repeatArr = [];//保存重复数据
let isRepeat = (m,n) => {return m.class==n.class&&m.team==n.team};//判断是否重复
for(let i=0;i<this.arr.length;i++){
let item = this.arr[i];
let repeatFlag = subArr.findIndex(el => isRepeat(el,item));
if(repeatFlag>-1){
repeatArr.push({index:repeatFlag,combine:item})
}else{
subArr.push(item);
}
}
for(let j=0;j<subArr.length;j++){
for(let k=0;k<repeatArr.length;k++){
if(j==repeatArr[k].index)
subArr[j].member = subArr[j].member.concat(repeatArr[k].combine.member)
}
}
console.log(subArr)
}
思路:主要分为两个步骤,1.统计重复,2.合并数组
问题二:
在以上代码运行时发现数据总是不对应,arr是数据源,一眼望去push不会修改源数组,也无赋值等会造成源数组改变的操作,但同时打印源数组与自定义subArr
却发现源数组也发生了改变。
原因:数据嵌套太多层,push只拷贝了arr内部元素,而arr内部元素的数组元素索引依旧不变。
解决:一种是通过递归深拷贝数据,另一种是借助JSON.stringify
。由于我用到的数据没有涉及时间格式等JSON.stringify不能转化的格式,我选用的第二种:
let copySource = JSON.parse(JSON.stringify(this.arr))
//后续将this.arr位置全替换成copySource