我有一个像这样结构的对象:
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中是否有更好的解决方案,或者这是最好的解决方案?
答案 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 比您在此处发布的任何其他方法更快。这主要是因为它只遍历了一次对象。