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()