使用 lo-dash/underscore 中的 _.pluck 方法获取一个对象

6

我有一个这样结构化的对象:

var my_object = {
  first_item: {important_number: 4},
  second_item: {important_number: 6},
}

然而,我希望有一个像这样结构化的对象:
{
  first_item: 4,
  second_item: 6,
}

我本以为可以用_.pluck来得到这个结果:

_.pluck(my_object, "important_number")

但这给了我:
[0: 4, 1: 6]

很好,但我需要实际对象的名称。我试着摆弄了一下,最终得到了这个:

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

这种方法可以达到预期的效果,但并不像我想象的那么简单。在underscore/lodash中是否有更好的解决方案,或者这已经是目前最好的解决方案了?


由于所有下划线枚举器都返回数组,这是您可以获得的最佳结果(尽管您可以使用类似zip(keys(obj), pluck(values(obj), "content"))的更短但不太高效的方法)。 - Bergi
我刚为这两个选项设置了一个JSPerf测试,在我的浏览器中,你的选项快了2%! http://jsperf.com/getting-an-object-from-pluck - JJJollyjim
然иҖҢпјҢдҪ зҡ„д»Јз Ғиҫ“еҮәдёә[["first_item", 4], ["second_item", 6]]пјҢиҖҢдёҚжҳҜйў„жңҹзҡ„{first_item: 4, second_item: 6}гҖӮ - JJJollyjim
哎呀,我的意思是使用_.object(将键值列表压缩为对象),而不是_.zip - Bergi
3个回答

8
在Lo-Dash中,您还可以使用_.transform,它是_.reduce的更强大的替代品。
_.transform(my_object, function(memo, val, key) {
  memo[key] = val.important_number;
});

5

实际上,您所描述的——也就是“用于对象值的pluck”——可以写为:

_.mapValues(my_object, "important_number")

请查看_.mapValues的文档。
Lo-Dash中到处都使用了_.createCallback ——它执行字符串与属性之间的转换: 寻找"_.pluck"风格回调函数

3

我知道使用Lo-Dash/Underscore很有趣,但是如果你需要使用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循环,并看看神奇的效果:http://jsperf.com/getting-an-object-from-pluck/2

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


5
嗨,我是jsPerf和Lo-Dash的维护者;D。你的jsPerf并不神奇,仅仅因为它有较少的抽象层,所以它更快,但这并不是什么新鲜事。上面发布的方法只迭代对象一次,但它们要执行回调函数的成本,并且比你的目标代码片段更通用。OP正在寻找一个使用库糖而不是拆分到裸JS的简单选项。 - John-David Dalton
我之前不知道 _.transform - 知道了很不错(我主要使用 underscore.js)。总之,如果您有一个函数解决海报的问题,那就是他想要的。 - Gilad Peleg
以下是一种函数解决方案:_.mapValues(my_object, "important_number") - TWiStErRob
不一定更快:编写和维护这样的“正则表达式”可能需要花费每年几分钟的时间,而每次运行只能获得几毫秒的收益;如果代码在外部循环中运行,则必须在一年内大约运行该代码10^5次,才能证明由于“优化”而导致的开发人员损失的时间是合理的。人类是最慢的设备+阿姆达尔定律=计算机延迟可能极小。 - FxIII

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接