下划线.js:使用对象中找到的键从对象列表中创建映射

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

本文关键字:对象 列表 映射 创建 js 下划线      更新时间:2023-09-26

我正在使用优秀的下划线.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

任何帮助表示赞赏。

对于它的价值,既然下划线.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()