给定输入:
[{ a: 1 }, { b: 2 }, { c: 3 }]
如何返回:
{ a: 1, b: 2, c: 3 }
对于带有lodash的数组it's not a problem,但在这里我们有对象数组。
答案 0 :(得分:46)
let merged = Object.assign(...arr); // ES6 (2015) syntax
var merged = Object.assign.apply(Object, arr); // ES5 syntax
请注意,Object.assign
尚未在许多环境中实现,您可能需要对其进行填充(使用core-js,另一个polyfill或使用MDN上的polyfill)。
你提到了lodash,所以值得一提的是它附带了一个_.assign
函数用于此目的:
var merged = _.assign.apply(_, [{ a: 1 }, { b: 2 }, { c: 3 }]);
但我真的推荐新的标准库方式。
答案 1 :(得分:5)
使用lodash,您可以使用merge():
var arr = [ { a: 1 }, { b: 2 }, { c: 3 } ];
_.merge.apply(null, [{}].concat(arr));
// → { a: 1, b: 2, c: 3 }
如果您在多个地方执行此操作,可以使用partial()和spread()使merge()
更加优雅:
var merge = _.spread(_.partial(_.merge, {}));
merge(arr);
// → { a: 1, b: 2, c: 3 }
答案 2 :(得分:4)
这是一个不使用ES6方法的版本......
var arr = [{ a: 1 }, { b: 2 }, { c: 3 }];
var obj = {};
for(var i = 0; i < arr.length; i++) {
var o = arr[i];
for(var key in o) {
if(typeof o[key] != 'function'){
obj[key] = o[key];
}
}
}
console.log(obj);
答案 3 :(得分:4)
您可以使用下面的underscore.extend函数:
var _ = require('underscore');
var a = [{ a: 1 }, { b: 2 }, { c: 3 }];
var result = _.extend.apply(null, a);
console.log(result); // { a: 1, b: 2, c: 3 }
console.log(a); // [ { a: 1, b: 2, c: 3 }, { b: 2 }, { c: 3 } ]
为防止修改原始数组,您应该使用
var _ = require('underscore');
var a = [{ a: 1 }, { b: 2 }, { c: 3 }];
var result = _.extend.apply(null, [{}].concat(a));
console.log(result); // { a: 1, b: 2, c: 3 }
console.log(a); // [ { a: 1 }, { b: 2 }, { c: 3 } ]
答案 4 :(得分:1)
我有一个简洁的小解决方案,不需要填充。
var arr = [{ a: 1 }, { b: 2 }, { c: 3 }];
var object = {};
arr.map(function(obj){
var prop = Object.getOwnPropertyNames(obj);
object[prop] = obj[prop];
});
希望有所帮助:)
答案 5 :(得分:0)
在Object.assign
函数中很好地使用了array.prototype.reduce
:
let merged = arrOfObjs.reduce((accum, val) => {
Object.assign(accum, val);
return accum;
}, {})
这种方法不会突变对象的输入数组,这可以帮助您避免难以解决的问题。
答案 6 :(得分:0)
您可以轻松地将对象平整为阵列。
function flatten(elements) {
return elements.reduce((result, current) => {
return result.concat(Array.isArray(current) ? flatten(current) : current);
}, []);
};
答案 7 :(得分:0)
除了已接受的答案外,还有ES6的运行代码段。
let input = [{ a: 1 }, { b: 2 }, { c: 3 }]
//Get input object list with spread operator
console.log(...input)
//Get all elements in one object
console.log(Object.assign(...input))
答案 8 :(得分:-1)
在提出这个问题 6 年后。
Object.assign 是我最喜欢的答案(以上)。
但这也合法吗?
let res = {};
[{ a: 1 }, { b: 2 }, { c: 3 }].forEach(val => {
let key = Object.keys(val);
console.log(key[0]);
res[key] = val[key];
})