合并两个对象并增加ECMAScript 6中的键

时间:2018-07-01 15:53:25

标签: javascript ecmascript-6 javascript-objects

我想将多个对象合并在一起,但是由于它们的键是相等的,因此在使用Object.assign()时,它只会返回与最后一个对象相同的属性。

let obj1 = {0: "a", 1: "b", 2: "c", 3: "d"};
let obj2 = {0: "e", 1: "f", 2: "g", 3: "h"};

但是我想要的输出

let output = {0: "a", 1: "b", 2: "c", 3: "d", 4: "e", 5: "f", 6: "g", 7: "h"};

4 个答案:

答案 0 :(得分:5)

您实际上应该只使用数组。这会让您的生活更轻松。

话虽如此,您可以从对象中提取values,这些对象将是数组,并连接它们,然后使用以下方法创建一个新对象:

let obj1 = {0: "a", 1: "b", 2: "c", 3: "d"}
let obj2 = {0: "e", 1: "f", 2: "g", 3: "h"}

let obj = Object.values(obj1).concat(Object.values(obj2))
          .reduce((a, c, i) => (a[i] = c, a), {})
console.log(obj)

您还可以将扩展语法用于:

let obj1 = {0: "a", 1: "b", 2: "c", 3: "d"}
let obj2 = {0: "e", 1: "f", 2: "g", 3: "h"}

let obj = {...Object.values(obj1).concat(Object.values(obj2))}
console.log(obj)

在这样的情况下应该发生什么是模棱两可的:

let obj1 = {0: "a", 1: "b", 2: "c", 4: "d"}
let obj2 = {0: "e", 1: "f", 2: "g", 3: "h"}

答案 1 :(得分:2)

如果键是数字键,则使用Object.assign([], obj)(或Object.values(obj),虽然不是ES6 )将两个对象都转换为数组,然后concat使用Object.assign将所有可枚举的属性放到新对象中:

const obj1 = {
      0: "a",
      1: "b",
      2: "c",
      3: "d"
    },
  obj2 = {
      0: "e",
      1: "f",
      2: "g",
      3: "h"
    },
  output = Object.assign({}, Object.assign([], obj1).concat(Object.assign([], obj2)));

console.log(output);

尽管,如果数字键假设成立,请考虑跳过最后一个Object.assign。这些属性将完全相同,再加上一些有用的数组方法和属性(可枚举的属性将完全匹配)。

答案 2 :(得分:2)

您可以通过串联所有值来连接任意数量的对象,然后将它们分配回对象。

let obj1 = { 0: "a", 1: "b", 2: "c", 3: "d" },
    obj2 = { 0: "e", 1: "f", 2: "g", 3: "h" },
    merged = Object.assign({}, [obj1, obj2].reduce((r, o) => r.concat(Object.values(o)), []));
    
console.log(merged);

答案 3 :(得分:1)

创建对象数组并使用reduce方法。将空对象传递为thisArg并保留index并将其增加,并且此index将用作键。使用Object.values的reduce方法将为数组提供当前对象的所有值,例如[a,b,c,d]。现在,迭代此数组并更新最初传递的空白对象

let obj1 = {
  0: "a",
  1: "b",
  2: "c",
  3: "d"
};
let obj2 = {
  0: "e",
  1: "f",
  2: "g",
  3: "h"
};
let comObj = [obj1, obj2]
let index = 0;
let mrgObj = comObj.reduce(function(acc, curr) {
  let getVals = Object.values(curr);
  getVals.forEach(function(item, currIndex) {
    acc[index] = item
    index++;
  })
  return acc;
}, {});
console.log(mrgObj)