Underscore.js:创建一个映射出使用密钥对象列表中的对象中找到(Underscore.js

2019-06-24 03:20发布

我使用的是优秀的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没有遍历对象自己。

任何帮助表示赞赏。

Answer 1:

对于什么是值得的,因为underscore.js您现在可以使用_.object()

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


Answer 2:

对于你的情况,你应该使用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');


Answer 3:

还有这种方法

_.reduce(data, function (o, item) { o[item.key] = item.value; return o }, {})

这是一个语句中的内部函数两种说法。



Answer 4:

我不认为有您需要的东西比GROUPBY接近。 即使有,也不会干,比一个简单的好:

var some_map = {};
_.each(some_object_array, function(val) {
  some_map[val.id] = val;
});


Answer 5:

我这个情况下,你不需要遍历数组。 没有map ,没有reduce ,没有transform 。 所有你需要的是旧的pluck

_.object(_.pluck(some_object_array, 'id'), some_object_array);


Answer 6:

对于ES6,它的

var some_map = _.chain(some_object_array)
                .map(item => [item.id, item])
                .object()
                .value()


Answer 7:

我解决了这个方法,使用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> 



文章来源: Underscore.js: create a map out of list of objects using a key found in the object