萌新报道:JavaScript对象数组合并去重,大佬请轻喷

15 篇文章 0 订阅
15 篇文章 0 订阅

最近需求改完了,测试也还没来得及测试,所以今天上午花了点时间去实现这个东西,所以自己来回答自己的问题算了,如果有碰到相似问题的朋友,说不定还能骗点赞。如果有任何考虑不周的地方,也希望各位大佬来指出

PS(因为我的需求是需要拿到一个全新的对象,所以会用到深复制)

1、首先实现一个深复制的函数(这个实现过程很简单,随便百度一下一大把,我也是边看边实现)

function deepClone(obj){
	//声明一个变量data用来保存深复制后的数据
	let data;
	//判断该参数是否存在且是Object类型
	if(obj && typeof obj === Object){
		//声明一个变量,并判断他是array还是object
		data = Array.isArray(obj) ? [] : {};
		//便利该对象
		for(key in obj){
			//如果该obj的孩子也是一个对象,那么递归调用deepClone
			if(typeof key === Object){
				data[key] = deepClone(obj[key])
			}else{
				data[key] = obj[key]
			}
		}

	}else{
		data  = obj;
	}
	return data;
}

2、谈谈合并对象的一些想法

首先,我眼中对象合并去重是这样的func(obj,newObj)

参数obj代表以前的一个对象,newObj代表新的一个对象。obj和newObj各自独有的属性,将会保留;而obj和newObj中相同的属性将被newObj所覆盖,这就是我们眼中的合并去重,然后来看看代码实现,其实不难:

/*
	使用说明:
	1、obj和newObj不同的属性或对象将进行合并
	2、obj和newObj相同的属性,会被newObj所覆盖
	3、返回得到一个合并后的对象(这里是深复制)
*/
function combineObj(obj,newObj){
	//判断传入的两个参数是否存在且是Object类型
	if(obj && typeof obj === "object" && newObj && typeof newObj === "object"){

		//声明一个变量,并判断他是array还是object
		let data = Array.isArray(obj) ? [] : {};

		//遍历以前的对象
		for(key in obj){

			//如果newObj拥有这个属性
			if(newObj[key]){

				//newObj和obj同时拥有这个属性
				if(obj[key]){
					//判断这个两个属性是否是object,否则newObj[key]直接赋值给data[key]
					if(typeof newObj[key] === "object" && typeof obj[key] === "object"){
						data[key] = combineObj(obj[key],newObj[key])
					}else{
						data[key] = newObj[key]
					}
				}else{
					//如果这个属性是Object,直接对该对象进行深复制
					if(typeof newObj[key] === "object"){
						data[key] = deepClone(newObj[key])
					}else{
						data[key] = newObj[key]
					}
				}

			}else{
				//如果这个属性是Object,直接对该对象进行深复制
				if(typeof obj[key] === "object"){
					data[key] = deepClone(obj[key])
				}else{
					data[key] = obj[key]
				}
			}
		}

		//遍历新的对象
		for(key in newObj){
			//如果obj没有这个属性,那么直接添加到data中
			if(!obj[key]){
				//如果这个属性是Object,直接对该对象进行深复制
				if(typeof newObj[key] === "object"){
					data[key] = deepClone(newObj[key])
				}else{
					data[key] = newObj[key]
				}
			}
		}

		return data

	}else{
		return "参数出错"
	}
}

目前来看,自己测试的数据暂无问题,具体还有不有bug,尚且不知,如果有问题欢迎指出。

毕竟小白,代码青涩,忘各位大佬见谅

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值