最近需求改完了,测试也还没来得及测试,所以今天上午花了点时间去实现这个东西,所以自己来回答自己的问题算了,如果有碰到相似问题的朋友,说不定还能骗点赞。如果有任何考虑不周的地方,也希望各位大佬来指出
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,尚且不知,如果有问题欢迎指出。
毕竟小白,代码青涩,忘各位大佬见谅