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

时间:2012-05-02 15:04:16

标签: javascript underscore.js javascript-objects

我正在使用优秀的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而不是自己迭代对象。

任何帮助表示感谢。

7 个答案:

答案 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>