60

私は優れたUnderscore.jsライブラリを使用しています。JavaScript または jQuery を使用してうまく実行できる特定のタスクがありますが、Underscore で見逃していた何らかの抽象化が利用できるかどうか疑問に思っていました。

基本的に私はそのようなオブジェクトを持っています -

var some_object_array = [{id: "a", val: 55}, {id: "b", val: 1}, {id: "c", val: 45}];

これを次のように変換したい -

var some_map = {"a": {id: "a", val: 55}, "b": {id: "b", val: 1}, "c": {id: "c", val: 45}};

使えることはわかっています_.groupBy(some_object_array, "id")。しかし、これは次のようなマップを返します-

var some_grouped_map = {"a": [{id: "a", val: 55}], "b": [{id: "b", val: 1}], "c": [{id: "c", val: 45}]};

これは、宣伝されていることを行うことに注意してください。some_mapしかし、私はオブジェクトを自分で反復処理せずに取得したいと考えていました。

どんな助けでも感謝します。

4

6 に答える 6

90

価値があるのは、underscore.js を使用できるようになったためです。_.object()

var some_map = _.object(_.map(some_object_array, function(item) {
   return [item.id, item]
}));
于 2012-10-12T04:01:23.527 に答える
31

こんな方法もあります

_.reduce(data, function (o, item) { o[item.key] = item.value; return o }, {})

これは、内部関数に 2 つのステートメントがある 1 つのステートメントです。

于 2012-10-08T21:58:26.260 に答える
13

私はあなたのニーズのためにgroupByよりも近いものはないと思います。あったとしても、それは単純なものよりもうまくいくことはありません。

var some_map = {};
_.each(some_object_array, function(val) {
  some_map[val.id] = val;
});
于 2012-05-02T15:34:16.077 に答える
4

この場合、配列を反復する必要はありません。違うmap、違うreduce、違うtransform。必要なのは古いものだけpluck

_.object(_.pluck(some_object_array, 'id'), some_object_array);
于 2015-03-16T10:46:09.817 に答える
2

ES6の場合、それは

var some_map = _.chain(some_object_array)
                .map(item => [item.id, item])
                .object()
                .value()
于 2016-04-12T19:51:41.580 に答える