使用lo-dash / underscore从_.pluck获取对象

时间:2013-09-05 09:40:17

标签: javascript underscore.js lodash

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

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;
}, {});

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

3 个答案:

答案 0 :(得分:8)

在Lo-Dash中,您还可以使用_.transform_.reduce的更强大的替代方法:

_.transform(my_object, function(memo, val, key) {
  memo[key] = val.important_number;
});

答案 1 :(得分:5)

实际上您所描述的内容 - 即“pluck对象值” - 可以写成:

_.mapValues(my_object, "important_number")

请参阅_.mapValues的文档。

_.createCallback - 将字符串转换为属性魔法 - 在Lo-Dash的所有位置使用:搜索"_.pluck" style callback

答案 2 :(得分:3)

我知道使用Lo-Dash / Underscore很有趣,但是如果你必须使用2个函数而不是只使用常规循环,那么你最好使用'old_school'编码风格:

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

常规循环至少 2x 比您在此处发布的任何其他方法更快。这主要是因为它只遍历了一次对象。