web-dev-qa-db-ja.com

オブジェクトの配列をLodashのオブジェクトに変換する方法は?

私はこれを持っています:

    [ { list: 
             [ [Object],
               [Object] ] },
      { head:
             [ [Object],
               [Object] ] }
    ]

そしてそれをこれに変えたいです:

    { list: 
                 [ [Object],
                   [Object] ],
      head:      [ [Object],
                   [Object] ]
    }

つまり、オブジェクトへのオブジェクトの配列です。 lodashでこれを実現するのは素晴らしいことです。

13
Stefan
_.reduce(array, function(memo, current) { return _.assign(memo, current) },  {})
21
djaszczurowski

さらに短い解決策は次のようになると思います:

Object.assign({}, ...array)

Lodashを要求したことは知っていますが、この方法が必要なようにも見えません。 _.extendを使用する場合を除きます。

14
rcsole

ここに短いバージョンがあります:

__.transform(array, _.ary(_.extend, 2),  {});
_

transform() 関数は reduce() に似ていますが、何も返さないことを期待しています。 extend() は最初の引数を変更するため、transform()に直接渡すことができます。 ary() で囲まれているため、2つの引数のみが渡されます。

8
Adam Boduch

@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"})

それでおしまい!

6

Lodash 4でfromPairsを使用します https://lodash.com/docs#fromPairs

_.fromPairs([['fred', 30], ['barney', 40]]);

1
udnisap