【问题标题】:Getting an object from _.pluck with lo-dash/underscore使用 lo-dash/underscore 从 _.pluck 获取对象
【发布时间】:2013-09-05 09:40:17
【问题描述】:

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

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 中是否有更好的解决方案,或者这是最好的解决方案?

【问题讨论】:

  • 因为所有的下划线枚举器都返回数组,这是你能得到的最好的(虽然你可以像zip(keys(obj), pluck(values(obj), "content"))这样更短但效率更低的东西)。
  • 我刚刚为 2 设置了 JSPerf 测试,在我的浏览器中,您的选项速度提高了 2%! jsperf.com/getting-an-object-from-pluck
  • 但是,你的给出的是:[["first_item", 4], ["second_item", 6]] 而不是预期的{first_item: 4, second_item: 6}
  • 糟糕,我的意思是_.object(将键值列表压缩到对象)而不是_.zip

标签: javascript underscore.js lodash


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    实际上,您所描述的 - 即“pluck for object values” - 可以写成:

    _.mapValues(my_object, "important_number")
    

    请参阅_.mapValues 的文档。

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

    【讨论】:

      【解决方案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

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

      【讨论】:

      • 嗨,这里是 jsPerf 和 Lo-Dash 的维护者;D。您的 jsPerf 并不神奇,它只是更快,因为它的抽象更少,但这并不是什么新鲜事。上面发布的方法只迭代对象一次,但是它们会产生执行回调的成本,并且比您的目标 sn-p 更通用。 OP 正在寻找一个使用 lib 糖而不是将其展开为裸机 JS 的更简单的选项。
      • 我不知道 _.transform - 很高兴知道它(我主要使用 underscore.js)。无论如何,如果您对海报问题有一个 1 功能解决方案,那就是他想要的
      • 这里是 1 函数解决方案:_.mapValues(my_object, "important_number")
      • 没有必要更快:编写和维护这样的“常规 for”可能会花费您每年最多几分钟,而每次运行则需要几毫秒;如果代码在外部循环中运行,则您必须在一年内运行该代码大约 10^5 次,以证明开发人员因“优化”而损失的时间是合理的。人类是最慢的设备 + 阿姆达尔定律 = 计算机延迟可以忽略不计。
      猜你喜欢
      • 1970-01-01
      • 2014-12-19
      • 1970-01-01
      • 2018-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多