web-dev-qa-db-ja.com

オブジェクトを含む配列を1つのオブジェクトにフラット化します

与えられた入力:

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

返品方法:

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

配列の場合 それは問題ではありません lodashがありますが、ここにはオブジェクトの配列があります。

29
Szymon Toda

使用する - 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 }]);

しかし、私は本当に新しい標準ライブラリの方法をお勧めします。

50

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 }
_
5
Adam Boduch

これは、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);

フィドル: http://jsfiddle.net/yaw3wbb8/

4
Michael Coxon

次のような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
Vladimir

私はポリフィルを必要としないきちんとした小さなソリューションを持っています。

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

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

それが役立つことを願っています:)

1
jonny

オブジェクトを配列に簡単にフラット化できます。

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

Object.assign関数とarray.prototype.reduceの素敵な使用法は次のとおりです。

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

このアプローチでは、オブジェクトの入力配列を変更しないため、トラブルシューティングが困難な問題を回避できます。

0
deed02392