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

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

4

3 回答 3

8

在 Lo-Dash 中,您还可以使用_.transform ,它是_.reduce更强大的替代方案:

_.transform(my_object, function(memo, val, key) {
  memo[key] = val.important_number;
});
于 2013-09-06T20:08:10.793 回答
5

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

_.mapValues(my_object, "important_number")

请参阅_.mapValues.

_.createCallback- 将字符串转换为属性魔术 - 在 Lo-Dash 中到处使用:搜索"_.pluck" style callback.

于 2014-02-28T22:46:22.293 回答
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

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

于 2013-09-05T18:48:00.853 回答