js深度合并两个数组对象的实现
作者:CahierX
这篇文章主要介绍了js深度合并两个数组对象的实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
js深度合并两个数组对象
js合并两个数组对象, 如果a中含有b,则b的值覆盖a的值 如果a中不含有b 则b的值新增到a
MergeRecursive(obj1, obj2) { // 合并两个数组 for (var p in obj2) { if (obj1[p] === undefined) { // 如果obj1没有p 直接把obj2的p加入 obj1[p] = obj2[p] } try { if (obj2[p].constructor === Object) { obj1[p] = common.MergeRecursive(obj1[p], obj2[p]) } else { if (typeof obj1[p] === 'object') { for (let i = 0; i < obj2[p].length; i++) { if (typeof obj2[p][i] === 'object') { // 数组里面的数据也是数组对象 则进行查找重复并赋值 if (obj1[p][i] === undefined) { // 如果obj1中没有obj2的属性就把obj2的属性push到1里 obj1[p].push(obj2[p][i]) } else { common.uniq(obj1[p][i], obj2[p][i]) } } else { obj1[p] = obj2[p] // 数组 但是里面的数据是普通类型 直接赋值 } } } else { obj1[p] = obj2[p] // 普通类型有直接赋值 obj1没有的就创建并赋值 } } } catch (e) { console.log(e) } } return obj1 }, uniq(obj1, obj2) { // 查找重复并obj2的值赋给obj1 Object.keys(obj1).forEach(key => { if (typeof obj1[key] === 'object') { try { if (key in obj2) { // 确保obj2有obj1的key 不然会导致失败 common.uniq(obj1[key], obj2[key]) } } catch (err) { obj1 = obj2 } } else { if (key in obj2) { obj1[key] = obj2[key] } Object.keys(obj2).forEach(obj2key => { // 把obj2中有的obj1中没有的添加进去 if (!(obj2key in obj1)) { obj1[obj2key] = obj2[obj2key] } }) } }) },
关于数组对象的深浅合并
数组对象的深浅合并
- 浅合并:只会把没有冲突的属性合并上,对于有冲突的属性,后者会完全覆盖前者的属性值,且只会合并第一层
- 深合并:对于有冲突的属性,会把将两个属性值进行合并,而不是简单的让谁覆盖谁
function deepMearge(obj, target={}) { // target 替换 obj let p = {}; // 是为了调用 Object.prototype.toSring方便 for(let key in target) { let isA = p.toString.call(obj[key]) === '[object Object]', isB = p.toString.call(target[key]) === '[object Object]'; if(isA && isB) { obj[key] = deepMearge(obj[key], target[key]) } else if(Array.isArray(obj[key]) && Array.isArray(target[key])){ // Array.from 方法可以把一个类数组对象转为数组 obj[key] = Array.from(new Set(obj[key].concat(target[key])) ) } else { obj[key] = target[key]; } } return obj; }
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。