私はこれを持っています:
[ { list:
[ [Object],
[Object] ] },
{ head:
[ [Object],
[Object] ] }
]
そしてそれをこれに変えたいです:
{ list:
[ [Object],
[Object] ],
head: [ [Object],
[Object] ]
}
つまり、オブジェクトへのオブジェクトの配列です。 lodashでこれを実現するのは素晴らしいことです。
_.reduce(array, function(memo, current) { return _.assign(memo, current) }, {})
さらに短い解決策は次のようになると思います:
Object.assign({}, ...array)
Lodashを要求したことは知っていますが、この方法が必要なようにも見えません。 _.extend
を使用する場合を除きます。
ここに短いバージョンがあります:
__.transform(array, _.ary(_.extend, 2), {});
_
transform() 関数は reduce() に似ていますが、何も返さないことを期待しています。 extend() は最初の引数を変更するため、transform()
に直接渡すことができます。 ary() で囲まれているため、2つの引数のみが渡されます。
@rcsoleのすばらしい答えに基づいて構築するには、これはうまく機能します。
states = [{
state: "NY",
name: "New York",
}, {
state: "AZ",
name: "Arizona",
}]
statesObj = Object.assign({}, ...states.map(state => {
return { [state.state]: state.name }
}))
{
AZ: "Arizona",
NY: "New York",
}
これを複数の部分に分割しましょう:
// Step 1: Transform from [{state: "Foo", name: "Bar"}, ...] to [{Foo: "Bar"}, ...]
mappedStates = states.map(state => { return { [state.state]: state.name } })
// Step 2: Merge all the objects in that array into a single new object
statesObj = Object.assign({}, ...mappedStates)
ステップ1はmap
を使用して、配列(すべての状態オブジェクト)のすべての項目を反復します。 map
は、すべてのstate
オブジェクトに対して関数を実行し、状態をキーとして、名前を値として持つ新しいオブジェクトを返します。 state.state
はオブジェクトリテラルの動的な値であるため、角かっこで囲む必要があります。
ステップ2はObject.assign
を使用して、mappedStates
配列内のすべての新しい状態オブジェクトを新しいオブジェクトにマージします(最初のパラメーター、{}
)。 3つのドット...
は何のためのものですか?それがスプレッドオペレーターです。 mappedStates
配列のすべての要素を受け取り、それらをObject.assign
メソッドの直接引数に変換します。
この例はそれを明確にします:
Object.assign({}, ...mappedStates)
と同じです
Object.assign({}, {AZ: "Arizona"}, {NY: "New York"})
それでおしまい!
Lodash 4でfromPairsを使用します https://lodash.com/docs#fromPairs
_.fromPairs([['fred', 30], ['barney', 40]]);