我想将多个对象合并在一起,但是由于它们的键是相等的,因此在使用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"};
答案 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)