JavaScript深度合并两个数组对象的实现方法

作者:纸飞机时间:2026-10-25 23:58:15浏览:537

本文介绍JavaScript中深度合并两个数组对象的实现逻辑。当源对象包含目标对象属性时,目标值覆盖源值;若源对象缺失该属性,则新增目标值。文章对比了浅合并与深合并的区别,并提供了处理对象嵌套及数组去重的具体代码示例,帮助开发者解决复杂数据结构合并时的冲突问题。

JavaScript深度合并两个数组对象的实现

在合并两个数组对象时,若源对象(a)中已存在目标对象(b)的键,则使用目标对象的值覆盖源对象;若源对象中不存在该键,则将目标对象的值新增到源对象中。

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;
  }

以上为个人经验,希望能给大家一个参考,也希望大家多多支持本站。

作者最新文章