Underscore.js:使用对象中的键创建对象列表中的地图

Cha*_*ntz 59 javascript javascript-objects underscore.js

我正在使用优秀的Underscore.js库.我有一个特定的任务,我可以使用JavaScript或jQuery做得很好但是想知道在Underscore中是否有某种抽象可以让我错过了.

基本上我有一个像这样的对象 -

var some_object_array = [{id: "a", val: 55}, {id: "b", val: 1}, {id: "c", val: 45}];
Run Code Online (Sandbox Code Playgroud)

我想把它转换成 -

var some_map = {"a": {id: "a", val: 55}, "b": {id: "b", val: 1}, "c": {id: "c", val: 45}};
Run Code Online (Sandbox Code Playgroud)

我知道我可以用_.groupBy(some_object_array, "id").但这会返回如此的地图 -

var some_grouped_map = {"a": [{id: "a", val: 55}], "b": [{id: "b", val: 1}], "c": [{id: "c", val: 45}]};
Run Code Online (Sandbox Code Playgroud)

请注意,这会做广告宣传的内容.但是我希望自己some_map不用迭代对象.

任何帮助赞赏.

cle*_*tus 89

FWIW因为你现在可以使用underscore.js了 _.object()

var some_map = _.object(_.map(some_object_array, function(item) {
   return [item.id, item]
}));
Run Code Online (Sandbox Code Playgroud)

  • 对象的映射是*有用的,我总是定义`mapo = _.compose(_.object,_. map);` (8认同)
  • 最新版本的下划线中没有删除`_.object()` (3认同)

小智 47

对于您的情况,您应该使用该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');
Run Code Online (Sandbox Code Playgroud)


Ott*_*ger 31

还有这种方法

_.reduce(data, function (o, item) { o[item.key] = item.value; return o }, {})
Run Code Online (Sandbox Code Playgroud)

哪个是内部函数中有两个语句的语句.

  • @ user2846569它将列表归结为单个对象.完美应用`reduce`. (6认同)

小智 13

我不认为有什么比groupBy更接近你的需求.即使有,它也不会比简单更好:

var some_map = {};
_.each(some_object_array, function(val) {
  some_map[val.id] = val;
});
Run Code Online (Sandbox Code Playgroud)