我使用的是优秀的Underscore.js库。 我有一个特定的任务,我可以做得很好使用JavaScript或jQuery的,但不知道是否有某种在下划线抽象avaialable我是错过了的。
基本上我有一个像这样的对象 -
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 }, {})
这是一个语句中的内部函数两种说法。
我不认为有您需要的东西比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: create a map out of list of objects using a key found in the object