web-dev-qa-db-ja.com

Underscore.js:オブジェクトで見つかったキーを使用して、オブジェクトのリストからマップを作成します

優れた nderscore.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_を取得したいと思っていました。

任意の助けに感謝します。

58
Chantz

Underscore.jsから _.object() を使用できるようになったので、

var some_map = _.object(_.map(some_object_array, function(item) {
   return [item.id, item]
}));
88
cletus

あなたの場合、indexBy関数を使用する必要があります。

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

var some_grouped_map = _.indexBy(some_object_array, 'id');
46
user3699395

この方法もあります

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

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

30

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

var some_map = {};
_.each(some_object_array, function(val) {
  some_map[val.id] = val;
});
13
Marwane K.A.

この場合、配列を繰り返す必要はありません。 mapではなく、reduceではなく、transformでもありません。必要なのは古いpluckだけです

_.object(_.pluck(some_object_array, 'id'), some_object_array);
3
AA.

eS6の場合、

var some_map = _.chain(some_object_array)
                .map(item => [item.id, item])
                .object()
                .value()
2
ryan