優れた 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
_を取得したいと思っていました。
任意の助けに感謝します。
Underscore.jsから _.object()
を使用できるようになったので、
var some_map = _.object(_.map(some_object_array, function(item) {
return [item.id, item]
}));
あなたの場合、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');
この方法もあります
_.reduce(data, function (o, item) { o[item.key] = item.value; return o }, {})
内部関数に2つのステートメントがある1つのステートメントです。
あなたのニーズのためにgroupByより近いものはないと思います。たとえあったとしても、それは単純なものより良くはなりません:
var some_map = {};
_.each(some_object_array, function(val) {
some_map[val.id] = val;
});
この場合、配列を繰り返す必要はありません。 map
ではなく、reduce
ではなく、transform
でもありません。必要なのは古いpluck
だけです
_.object(_.pluck(some_object_array, 'id'), some_object_array);
eS6の場合、
var some_map = _.chain(some_object_array)
.map(item => [item.id, item])
.object()
.value()