将具有对象的数组展平为1个对象

Szy*_*oda 29 javascript flatten lodash

给定输入:

[{ a: 1 }, { b: 2 }, { c: 3 }]
Run Code Online (Sandbox Code Playgroud)

如何退货:

{ a: 1, b: 2, c: 3 }
Run Code Online (Sandbox Code Playgroud)

对于数组而言,它不是 lodash 的问题,但在这里我们有对象数组.

Ben*_*aum 52

用途Object.assign:

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

var merged = Object.assign.apply(Object, arr); // ES5 syntax
Run Code Online (Sandbox Code Playgroud)

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

你提到了lodash,所以值得指出它带有一个_.assign用于此目的的功能,它可以做同样的事情:

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

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

  • 你不应该做`Object.assign({},... arr)`?! (9认同)
  • @BenjaminGruenbaum:是的,保留输入是一种最佳实践:-)当出现意外情况时,它可能导致丑陋的错误. (4认同)
  • 如果我没有添加额外的 {},我的 linter 会抛出“预计至少有 1 个参数,但得到 0 个或更多。” `Object.assign({}, ...ids`. (3认同)

Ada*_*uch 5

使用lodash,您可以使用merge():

var arr = [ { a: 1 }, { b: 2 }, { c: 3 } ];
_.merge.apply(null, [{}].concat(arr));
// ? { a: 1, b: 2, c: 3 }
Run Code Online (Sandbox Code Playgroud)

如果你在几个地方这样做,你可以merge()通过使用partial()spread()来做得更优雅:

var merge = _.spread(_.partial(_.merge, {}));
merge(arr);
// ? { a: 1, b: 2, c: 3 }
Run Code Online (Sandbox Code Playgroud)