【问题标题】:Merge two objects with keeping the properties of the first object if they are not existing in the second object [duplicate]如果第二个对象中不存在两个对象,则合并两个对象并保留第一个对象的属性[重复]
【发布时间】:2019-11-18 00:18:09
【问题描述】:

我在这里需要帮助,因为我找不到合适的解决方案: 我有两个对象:

obj1 = {
    name: '112',
    surname: { test: '123', other: '124' },
    age: 151,
    height: '183',
    weight: 80
  };

obj2 = {
    name: '114',
    surname: { test: '124' },
    age: 151,
    height: 184,
    weight: 81
  };

新对象必须有这个输出:

new = {
        name: '114',
        surname: { test: '124', other: '124' },
        age: 151,
        height: 184,
        weight: 81
      };

您可以看到在 surname 属性中保留了其他属性: 我已经尝试过类似的方法,但它不起作用,必须有一个更简单的解决方案:

const newObje = Object.keys(obj2).reduce(newObj, key) => {
    if (typeof (obj2[key]) === 'string' || obj2[key] === 'number') {
      newObj[key] = obj2[key];
    }
    if (typeof (obj2[key]) === 'object' || obj2[key] === 'array') {

    }
  }

【问题讨论】:

  • 你试过(...传播运算符?)
  • 如果您的对象可以任意深,您将需要递归解决方案。
  • 正如@TirthrajRao 提到的,您可以使用扩展运算符newObj = {...obj1,...obj2} ...
  • 如果您只需要使用给定的结构:let res = Object.assign(obj2, {surname: Object.assign(obj1.surname, obj2.surname)}) 或更短:let res = {...obj2, surname: {...obj1.surname, ...obj2.surname}}

标签: javascript reactjs object merge


【解决方案1】:

您可以使用合并函数并用最后一个值覆盖值。

function merge(...objects) {
    function m(t, s) {
        Object.entries(s).forEach(([k, v]) => {
            t[k] = v && typeof v === 'object' ? m(t[k] || {}, v) : v;
        });
        return t;
    }

    return objects.reduce(m, {});
}

var obj1 = { name: '112', surname: { test: '123', other: '124' }, age: 151, height: '183', weight: 80 },
    obj2 = { name: '114', surname: { test: '124' }, age: 151, height: 184, weight: 81 },
    result = merge(obj1, obj2);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

    【解决方案2】:

    你可以使用lodash.merge

    _.merge(obj1 , obj2)
    

    如您在文档中所见,它将深度合并两个对象

    此方法类似于 _.assign ,不同之处在于它递归地将源对象的自己的和继承的可枚举字符串键控属性合并到目标对象中。如果存在目标值,则跳过解析为未定义的源属性。数组和普通对象属性递归合并。其他对象和值类型被赋值覆盖。源对象从左到右应用。后续来源会覆盖先前来源的属性分配。

        let obj1 = {
            name: '112',
            surname: { test: '123', other: '124' },
            age: 151,
            height: '183',
            weight: 80
          };
          
        let obj2 = {
            name: '114',
            surname: { test: '124' },
            age: 151,
            height: 184,
            weight: 81
          };
          
    let newObj = _.merge(obj1, obj2)
    
    console.log(newObj)
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

    【讨论】: