Javascript:使用spread运算符合并两个对象

时间:2017-06-23 12:42:15

标签: javascript

var a = {
  1: {
    687: {
      name:'test1'
    }
  }
}
var b = {
  1: {
    689: {
      name:'test2'
    }
  }
}
var c = {
  ...a,
  ...b
}
console.log(c)

我期待结果是:

{
  1: {
    687: {
      name:'test1'
    },
    689: {
      name:'test2'
    }
  }
}

但是,它是:

{
  1: {
    689: {
      name:'test2'
    }
  }
}

我使用传播操作符错了吗?合并两个对象的最有效方法是什么?我创建了一个迭代对象中每个键的函数,它可以工作,但我认为这不是写入方式。

Object.assign({},a,b)也返回相同的内容(第一个结果,我不想要)。

我经历了问题How can I merge properties of two JavaScript objects dynamically?

但它没有回答我的问题。这个答案(https://stackoverflow.com/a/171256/1352853)也不是我想要的。

提前致谢。

3 个答案:

答案 0 :(得分:2)

lodash merge实际上做了我真正需要的东西。

https://blog.mariusschulz.com/2015/03/30/combining-settings-objects-with-lodash-assign-or-merge

// Defined within your component
var defaultSettings = {
    strictMode: true,
    formatting: {
        finalNewline: true,
        quotes: "double"
    }
};

// Provided by the developer using your component
var userSettings = {
    formatting: {
        quotes: "single"
    }
};

var assignedSettings = _.assign({}, defaultSettings, userSettings);

// {
//     strictMode: true,
//     formatting: {
//         quotes: "single"
//     }
// }

var mergedSettings = _.merge({}, defaultSettings, userSettings);

// {
//     strictMode: true,
//     formatting: {
//         finalNewline: true,
//         quotes: "single"
//     }
// }

答案 1 :(得分:1)

spread运算符用于数组和可迭代对象。 如果x = ['A','B','C']; 然后...x等于撰写x[0], x[1], x[2]

您希望逐个键地嵌入每个对象的嵌套对象,而不是替换以前的值。

let key;
let c = {};
for (key in a) {
    c[key] = Object.assign({}, a[key]);
}
for (key in b) {
    c[key] = Object.assign(c[key] || {}, b[key]);
}

答案 2 :(得分:-1)

您可以使用Object.assign(target, ...sources)进行合并。需要注意的几点: 1.此调用突变了目标。

  1. 如果源是引用而不是实际对象,则只复制引用。

  2. 如果存在相同的密钥,它们将被覆盖。

  3. 要深度复制媒体资源,请考虑Object.hasOwnProperty()Object.getOwnProperty()