将包含对象的数组展平为 1 个对象

Flatten array with objects into 1 object

给定输入:

[{ a: 1 }, { b: 2 }, { c: 3 }]

如何return:

{ a: 1, b: 2, c: 3 }

对于带有 lodash 的数组 it's not a problem 但这里我们有对象数组。

使用Object.assign:

let merged = Object.assign(...arr); // ES6 (2015) syntax

var merged = Object.assign.apply(Object, arr); // ES5 syntax

请注意,Object.assign 尚未在许多环境中实现,您可能需要对其进行 polyfill(使用 core-js、其他 polyfill 或使用 MDN 上的 polyfill)。

您提到了 lodash,因此值得指出的是,它带有一个 _.assign 函数来实现同样的目的:

 var merged = _.assign.apply(_, [{ a: 1 }, { b: 2 }, { c: 3 }]);

但我真的很推荐新的标准库方式。

这里是一个没有使用 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);

fiddle: http://jsfiddle.net/yaw3wbb8/

您可以像这样使用 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 } ]

Here can test it

我有一个不需要 polyfill 的简洁的小解决方案。

var arr = [{ a: 1 }, { b: 2 }, { c: 3 }];
var object = {};

arr.map(function(obj){
    var prop = Object.getOwnPropertyNames(obj);
    object[prop] = obj[prop];
});

希望对您有所帮助:)

对于lodash,你可以使用merge():

var arr = [ { a: 1 }, { b: 2 }, { c: 3 } ];
_.merge.apply(null, [{}].concat(arr));
// → { a: 1, b: 2, c: 3 }

如果您在多个地方这样做,您可以使用 partial() and spread():

merge() 更优雅一点
var merge = _.spread(_.partial(_.merge, {}));
merge(arr);
// → { a: 1, b: 2, c: 3 }

下面是 Object.assignarray.prototype.reduce 函数的一个很好的用法:

let merged = arrOfObjs.reduce((accum, val) => {
  Object.assign(accum, val);
  return accum;
}, {})

这种方法不会改变对象的输入数组,这可以帮助您避免难以解决的问题。

您可以轻松地将对象扁平化为数组。

function flatten(elements) {
  return elements.reduce((result, current) => {
    return result.concat(Array.isArray(current) ? flatten(current) : current);
  }, []);
};

在已接受的答案中添加 运行 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))

问这个问题 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];
})