背景
- 我报了珠峰课学习下,这次作业是实现个webpackmerge功能。
- 主要就是对象的合并,以及递归合并,但我这个实现改动了原对象,如果新建一个对象再进行实现可能实现起来复杂点。
- 这周日讲解代码,先把我的代码放出来。
代码
//合并重复项 相同键覆盖,不同键添加
function mymerge(obj1,obj2){
//先判断obj1类型。
if(obj1==null){//第一个obj1null或undefined直接返回obj2
return obj2
}
if(typeof obj1 !== 'object'){//function 或者基本类型
if(obj2==null){//null或undefined直接返回obj1
return obj1
}
if(typeof obj2==='object'){//obj2是obj时返回Obj2
return obj2
}
}
if(typeof obj1 === 'object'){//如果是对象
if(obj2==null){
//看obj2是不是对象,排除null
return obj1
}
if(typeof obj2 !== 'object'){//排除基本类型
return obj1
}
if(typeof obj2 === 'object'){//查找相同的属性,如果有相同属性,那么就覆盖obj2,如果没有,那么就合并。
for(let i in obj1){
for (let j in obj2){
if(i===j){//属性相同,判断这个值是不是obj,否则使用obj2的属性
if(typeof obj1[i] ==='object'){//如果值是obj,遍历值,看是否有相同的
resolveObj(obj1[i],obj2[j])
}else{
obj1[i]=obj2[j]
}
}else{//属性不同,直接并入
obj1[j]=obj2[j];
}
}
return obj1;
}
}
}
}
function resolveObj(obj1,obj2){//传进来是值对象,2个obj可能属性不一样,有可能里面还有对象
for(let i in obj1){
for(let j in obj2){
if(i===j){//属性相同
if(typeof obj1[i] ==='object'){//看值是不是obj 不是就用obj2的 是就递归
resolveObj(obj1[i],obj2[j])
}else{
obj1[i]=obj2[j];
}
}else{//不同属性直接并入
obj1[j]=obj2[j]
}
}
}
}
let a = {
name:{
xxx:1,
yyy:2
},
port:2,
df:2
}
let b ={
name:{
xxx:2
},
port:3
}
let c = mymerge(a,b)
console.log(c);
{ name: { xxx: 2, yyy: 2 }, port: 3, df: 2 }