Javascript Underline.js:使用对象中的键从对象列表中创建一个映射
我正在使用优秀的图书馆。我有一个特定的任务,我可以使用JavaScript或jQuery很好地完成,但我想知道下划线中是否有某种抽象,而我却忽略了它 基本上我有一个这样的物体-Javascript Underline.js:使用对象中的键从对象列表中创建一个映射,javascript,underscore.js,javascript-objects,Javascript,Underscore.js,Javascript Objects,我正在使用优秀的图书馆。我有一个特定的任务,我可以使用JavaScript或jQuery很好地完成,但我想知道下划线中是否有某种抽象,而我却忽略了它 基本上我有一个这样的物体- 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},
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(一些对象数组,“id”)
。但这会返回一个这样的映射-
var some_grouped_map = {"a": [{id: "a", val: 55}], "b": [{id: "b", val: 1}], "c": [{id: "c", val: 45}]};
请注意,这与广告中所宣传的一样。但是我希望自己不需要迭代对象就可以得到一些映射
感谢您的帮助。我认为没有比groupBy更能满足您的需求的了。即使有,也不会比简单的:
var some_map = {};
_.each(some_object_array, function(val) {
some_map[val.id] = val;
});
还有这个方法
_.reduce(data, function (o, item) { o[item.key] = item.value; return o }, {})
这是一条语句,内部函数中有两条语句 因为现在可以使用下划线.js
对于您的情况,您应该使用
indexBy
功能:
var some_object_array=[{id:“a”,val:55},{id:“b”,val:1},{id:“c”,val:45}];
var some_group_map=u.indexBy(some_object_数组,'id');
在这种情况下,不需要迭代数组。不映射
,不减少
,不变换
。您所需要的只是旧的弹拨
_.object(_.pluck(some_object_array, 'id'), some_object_array);
对于ES6,它是
var some_map = _.chain(some_object_array)
.map(item => [item.id, item])
.object()
.value()
好吧,这就是我最终做的。但是我很好奇是否有更好的方法来做这件事。+1因为我发现这种方法比
.object(uu.map(…)
更简单。\ucode>.chain(data.map((val)=>[val.id,val]).object().value()
对象映射非常有用,所以我总是定义mapo=.compose(u.object,val.map)
似乎已删除了。.object()
。下划线中还有其他选项吗?如果我错了,请纠正我,但我认为对于lodash,您也可以使用单个.transform
函数。要扩展@DustinGetz'注释。。。还可以使用下划线mixin,而不是将mapo
分配给全局作用域:.mixin({mapo:\.compose(\.object,\.map)})
\uU4.object()
在最新版本的下划线中没有删除。您不应该使用reduce,因为它用于不同的目的(reduce将一个值列表分解为一个值),基本上这是一个黑客行为,这会导致其他读取您的代码的开发人员混淆…@user2846569它将一个列表分解为一个对象。完美地应用了reduce
@OttoAllmendinger但是,指定的reduce操作使用了非同源参数,这是非常规的。在传统的缩减功能中,您希望a
和b
(此处o
和项
)的类型相同。事实上,强类型语言不允许此处所示的这种缩减功能。最适合这种情况的答案就是答案。名称some\u group\u map
令人困惑indexBy
用于键唯一的情况indexOf
生成非唯一键组。自lodash 4以来,它是\uu0.keyBy
中的
var some_map = _.chain(some_object_array)
.map(item => [item.id, item])
.object()
.value()