Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Underline.js:使用对象中的键从对象列表中创建一个映射_Javascript_Underscore.js_Javascript Objects - Fatal编程技术网

Javascript Underline.js:使用对象中的键从对象列表中创建一个映射

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},

我正在使用优秀的图书馆。我有一个特定的任务,我可以使用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}, "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()