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 回答
49

对于您的情况,您应该使用以下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');
于 2014-06-02T12:43:46.130 回答
31

还有这个方法

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

这是一个在内部函数中有两个语句的语句。

于 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 回答