我正在使用优秀的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
而不是自己迭代对象。
任何帮助表示感谢。
答案 0 :(得分:88)
对于它的价值,因为underscore.js你现在可以使用_.object()
var some_map = _.object(_.map(some_object_array, function(item) {
return [item.id, item]
}));
答案 1 :(得分:45)
对于您的情况,您应该使用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');
答案 2 :(得分:30)
还有这种方法
_.reduce(data, function (o, item) { o[item.key] = item.value; return o }, {})
哪一个语句在内部函数中有两个语句。
答案 3 :(得分:13)
我不认为有什么比groupBy更接近你的需求。即使有,它也不会比简单更好:
var some_map = {};
_.each(some_object_array, function(val) {
some_map[val.id] = val;
});
答案 4 :(得分:3)
在这种情况下,您不需要迭代数组。不是map
,不是reduce
,不是transform
。您只需要旧的pluck
_.object(_.pluck(some_object_array, 'id'), some_object_array);
答案 5 :(得分:2)
对于ES6,它是
var some_map = _.chain(some_object_array)
.map(item => [item.id, item])
.object()
.value()
答案 6 :(得分:-1)
我用这种方式解决了,使用lodash:
const ar = [
{ key: '1', val: 'a' },
{ key: '2', val: 'b' },
{ key: '3', val: 'c' }
]
const obj = _.keyBy({ ...ar }, 'key')
console.log(obj)
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.5/lodash.min.js"></script>