JS数组对象去重合并

现有数组persons,数组中的对象有name一样,但是id和age不同的,说明是不同的人,现在的问题就是将相同名字的人归并到同一对象下一个属性中

let persons = [
	{id: "1",name: "小明",age: "21"},
	{id: "2",name: "小红",age: "22"},
	{id: "3",name: "小刚",age: "23"},
	{id: "4",name: "小明",age: "24"},
	{id: "5",name: "小刚",age: "25"},
]

先执行去重操作,newArr用来保存去重后的新数组,tArr做为一个标记

function unique(arr,type){
	let newArr = [];
	let tArr = [];
	// 先判断数组是否存在
	if(arr.length == 0){
		return arr;
	}else{
		if(type){
			// 遍历我们要去重的数组
			for(let i=0;i<arr.length;i++){
				// 执行if时,说明新数组newArr中还没有保存这个值
				if(!tArr[arr[i][type]]){
					// 将值保存到新数组中
					newArr.push({
						name: arr[i].name,
						arr: []
					})
					// 添加标记,标记tArr[arr[i][type]]这个值为true,说明已经保存在新数组中,下次再遇到相同的tArr[arr[i][type]]会执行上面的else流程,即什么都不执行
					tArr[arr[i][type]] = true;
				}
			}
			return newArr;
		}else{
			// 说明同上
			for(let i=0;i<arr.length;i++){
				if(!tArr[arr[i]]){
					newArr.push({
						name: arr[i].name,
						arr: []
					})
					tArr[arr[i]] = true;
				}
			}
			console.log(newArr)
			return newArr
		}
	}
}

这是我们就已经得到了去重后的结果

newArr = [
	{name:"小明",arr: []},
	{name:"小红",arr: []},
	{name:"小刚",arr: []},
]

接着我们将具有相同name的对象合并

function concatArr(arr){
 	// 遍历新数组
	for(let i=0;i<arr.length;i++){
		// 遍历旧数组
		for(let j=0;j<persons.length;j++){
			// 判断新数组的name是否与旧数组的name相同,相同则将旧数组添加到新数组的arr属性中
			if(arr[i].name == persons[j].name){
				arr[i].arr.push(persons[j]);
			}
		}
	}
	return arr;
}

执行函数去重和合并函数

function aa(){
	let uniqueResult = unique(persons,"name");
	let concatArrResult = concatArr(uniqueResult);
}
aa();

最后得到的去重合并后的数组

concatArrResult = [
	{name:"小明",arr:[{age: "21",id: "1"​​,name: "小明"},{age: "24",id: "4"​​,name: "小明"}]},
	{name:"小红",arr:[{age: "22",id: "2"​​,name: "小红"}]},
	{name:"小刚",arr:[{age: "23",id: "3"​​,name: "小刚"},{age: "25",id: "5"​​,name: "小刚"}]},
]

附上完整代码

var persons =  [
	{id: "1",name: "小明",age: "21"},
	{id: "2",name: "小红",age: "22"},
	{id: "3",name: "小刚",age: "23"},
	{id: "4",name: "小明",age: "24"},
	{id: "5",name: "小刚",age: "25"},
];
function unique(arr,type){
	let newArr = [];
	let tArr = [];
	if(arr.length == 0){
		return arr;
	}else{
		if(type){
			for(let i=0;i<arr.length;i++){
				if(!tArr[arr[i][type]]){
					newArr.push({
						name: arr[i].name,
						arr: []
					})
					tArr[arr[i][type]] = true;
				}
			}
			return newArr;
		}else{
			for(let i=0;i<arr.length;i++){
				if(!tArr[arr[i]]){
					newArr.push({
						name: arr[i].name,
						arr: []
					})
					tArr[arr[i]] = true;
				}
			}
			return newArr
		}
	}
}
function concatArr(arr){
	for(let i=0;i<arr.length;i++){
		for(let j=0;j<persons.length;j++){
			if(arr[i].name == persons[j].name){
				arr[i].arr.push(persons[j]);
			}
		}
	}
	return arr
}
function aa(){
	let uniqueResult = unique(persons,"name");
	let concatArrResult = concatArr(uniqueResult);
	console.log(concatArrResult)
}
aa();
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值