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而不用自己迭代对象。

任何帮助赞赏。

6 Solutions collect form web for “Underscore.js:使用对象中find的键创build一个超出对象列表的地图”

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() 
  • 映射对象保留键
  • 使用Underscore.js从Object中删除空的属性/错误值
  • 我应该使用Angular.copy()还是_.clone()?
  • 使用UnderscoreJS从数组中删除一个项目
  • find具有下划线中特定键值的对象的数组索引
  • backbone.js - 事件,知道点击了什么
  • Underscore:基于多个属性的sortBy()
  • 在对象数组上使用下划线的“差异”方法
  • 用布尔值来隐藏/显示元素
  • 我如何使用underscore.js做一个asc和descsorting?
  • backbone.js&underscore.js CDN推荐?