Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/477.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 使用低破折号/下划线从u.pull获取对象_Javascript_Underscore.js_Lodash - Fatal编程技术网

Javascript 使用低破折号/下划线从u.pull获取对象

Javascript 使用低破折号/下划线从u.pull获取对象,javascript,underscore.js,lodash,Javascript,Underscore.js,Lodash,我有一个结构如下的对象: var my_object = { first_item: {important_number: 4}, second_item: {important_number: 6}, } { first_item: 4, second_item: 6, } 但是,我希望对象的结构如下: var my_object = { first_item: {important_number: 4}, second_item: {important_numbe

我有一个结构如下的对象:

var my_object = {
  first_item: {important_number: 4},
  second_item: {important_number: 6},
}
{
  first_item: 4,
  second_item: 6,
}
但是,我希望对象的结构如下:

var my_object = {
  first_item: {important_number: 4},
  second_item: {important_number: 6},
}
{
  first_item: 4,
  second_item: 6,
}
我本来希望能够通过
\uU5.pull
获得这个结果:

_.pluck(my_object, "important_number")
但这给了我:

[0: 4, 1: 6]
很好,但我需要对象的实际名称。我胡乱摆弄,结果是:

_.reduce(my_object, function(memo, val, key) {
  memo[key] = val.content;
  return memo;
}, {});

它有理想的效果,但并不像我想的那么简单。下划线/lodash是否有更好的解决方案,或者这是最好的解决方案?

我知道使用低破折号/下划线很有趣,但如果您必须使用2个函数而不是仅使用常规循环,则最好使用“老派”编码样式:

var data = {
  first_item: {important_number: 4},
  second_item: {important_number: 6},
};

var obj = {};

for (var i in data) {
  if (data.hasOwnProperty(i)) obj[i] = data[i].important_number;  
}
为了证明我的观点,我更新了您的JsPerf以包含常规for循环,并观看了魔术:


常规For循环比你们在这里发布的任何其他方法至少快2倍。这主要是因为它只遍历对象一次。

在Lo Dash中,您还可以使用一种更强大的替代方法:


实际上,您所描述的内容(即对象值的“
pull
”)可以写成:

_.mapValues(my_object, "important_number")
请参阅的文档


-这是字符串到属性的魔法-在Lo-Dash中到处都使用:搜索
“u.pulk”样式回调

由于所有下划线枚举数都返回数组,这是您将得到的最好结果(尽管您可以使用更短但效率更低的东西,如
zip(键(obj)、pulk(值(obj)、“内容”)
).我刚刚为2设置了一个JSPerf测试,在我的浏览器中,您的选择速度快了2%!然而,您的代码给出的是:
[[“first\u item”,4],“second\u item”,6]
而不是预期的
{first\u item:4,second\u item:6}
oops,我的意思是
.object
(将键和值列表压缩到对象),而不是
.zip
嗨,这里是jsPerf和Lo-Dash的维护者;你的jsPerf不是魔术,它只是更快,因为它的抽象性更少,但这并不是什么新鲜事。上面发布的方法只迭代对象一次,但是它们会产生执行回调的成本,并且比目标代码段更通用。OP正在寻找一个更简单的选项,使用lib sugar,而不是将其展开到裸机JS。我不知道
\uu.transform
-很高兴了解它(我主要使用下划线.JS)。无论如何,如果你对海报问题有一个1函数的解决方案,那就是他想要的:这是一个1函数的解决方案:
.mapValues(我的对象,“重要的数字”)
没有必要更快:这样的“常规for”的编写和维护每年可能花费你几分钟的时间,而不是每次运行几毫秒的时间;如果代码在外部循环中运行,您必须在一年内大约运行该代码10^5次,以证明开发人员由于“优化”而损失的时间是合理的。人类是最慢的设备+Amdahl定律=计算机延迟可以忽略不计。