与えられた入力:
[{ a: 1 }, { b: 2 }, { c: 3 }]
返品方法:
{ a: 1, b: 2, c: 3 }
配列の場合 それは問題ではありません lodashがありますが、ここにはオブジェクトの配列があります。
使用する - Object.assign
:
let merged = Object.assign(...arr); // ES6 (2015) syntax
var merged = Object.assign.apply(Object, arr); // ES5 syntax
ご了承ください Object.assign
は多くの環境でまだ実装されていないため、ポリフィルする必要があります(core-js、別のポリフィル、またはMDNでポリフィルを使用)。
あなたは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);
次のような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 } ]
私はポリフィルを必要としないきちんとした小さなソリューションを持っています。
var arr = [{ a: 1 }, { b: 2 }, { c: 3 }];
var object = {};
arr.map(function(obj){
var prop = Object.getOwnPropertyNames(obj);
object[prop] = obj[prop];
});
それが役立つことを願っています:)
オブジェクトを配列に簡単にフラット化できます。
function flatten(elements) {
return elements.reduce((result, current) => {
return result.concat(Array.isArray(current) ? flatten(current) : current);
}, []);
};
Object.assign
関数とarray.prototype.reduce
の素敵な使用法は次のとおりです。
let merged = arrOfObjs.reduce((accum, val) => {
Object.assign(accum, val);
return accum;
}, {})
このアプローチでは、オブジェクトの入力配列を変更しないため、トラブルシューティングが困難な問題を回避できます。