当前位置: 首页 > 工具软件 > HOBBY > 使用案例 >

js对以下结构数组处理时遇到的问题(arr:[{class:“a“,team:“hero“,member:[{name:“Tom“,hobby:[“读书“,“看报“]}]}],...])

管和志
2023-12-01

项目场景:

项目场景:按照相同关键字归类整合成新数组。
例如:按照学生的班级(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
 类似资料: