Underscore.js:使用对象中find的键创build一个超出对象列表的地图

我正在使用优秀的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而不用自己迭代对象。

任何帮助赞赏。

FWIW,因为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 }, {}) 

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

我觉得没有比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()