【问题标题】:What happened to Lodash _.pluck?Lodash _.pluck 怎么了?
【发布时间】:2016-05-10 05:52:48
【问题描述】:

我曾经使用过 Lodash _.pluck...我喜欢 pluck...

意识到 Lodash 不再支持 pluck(从 Lodash 4.x 开始),我正在努力记住要改用什么...

我去了the docs,按了cmd-f,输入了“pluck”,但我可怜的被遗弃的朋友甚至没有得到适当的提及……甚至没有一个“已被替换”……

有人可以提醒我应该改用什么吗?

【问题讨论】:

标签: javascript lodash


【解决方案1】:

啊哈! Lodash Changelog 说明了一切......

“删除 _.pluck 以支持 _.map 并使用 iteratee 速记”

var objects = [{ 'a': 1 }, { 'a': 2 }];

// in 3.10.1
_.pluck(objects, 'a'); // → [1, 2]
_.map(objects, 'a'); // → [1, 2]

// in 4.0.0
_.map(objects, 'a'); // → [1, 2]

【讨论】:

  • 他们不能简单地保持两者......吗?我认为没有必要仅仅为了重命名而重命名。
  • 它不是“重命名”——地图已经存在——只是简单地删除了 pluck。 Map 恰好提供了具有相同参数签名的类似功能。
  • 我为什么要在我的房子上放两个门铃?如果他们都做同样的事情,那就让人们免于困惑并摆脱一个。在我看来,这是值得做出重大改变的。摆脱多余的垃圾,简化 API,人们可以学会使用另一个门铃。它并不像它更难使用。我希望更多的开发人员会删除杂物。 +1 lodash 团队介绍了重大变化(这里没有讽刺,真的)。
  • 删除 pluck 只是为了好玩意味着没有人可以安全地更新 lodash。这不像是一种编译语言……太烦人了……
  • @ScottStafford 这就是为什么它被称为突破性的变化。如果您在主要版本更改时不费心阅读更新日志,那么请不要费心更新主要版本。您可以在同一主要版本中安全地更新。
【解决方案2】:

由于 ES6 已经起飞,不再需要 _.map_.pluck

这是使用 ES6 JavaScript 的替代方法:

clips.map(clip => clip.id)

【讨论】:

  • 甚至不需要 ES6:Array.prototype.map 在 ES5.1 标准中。请参阅browser support - 它很可能可以追溯到 2017 年任何人需要担心的问题!
  • @davnicwil Array.prototype.map 是 ES5.1,当然,但用于匿名函数的可爱箭头语法 => 不是。 ;)
  • @00Dani 好点!我的视线完全跳过了那个胖箭头。嗯,我猜clips.map(function (clip) { return clip.id }) 还不错;-)
  • 如果使用 ES6 clips.map(({id}) => id),实际上可以缩短它
  • 这是非常正确的,但了解_.pluck 发生了什么很有用,因为一些 ES6 之前的项目可能会使用 lodashe 的方法。 :)
【解决方案3】:

使用_.map 代替_.pluck。在最新版本中,_.pluck 已被删除。

【讨论】:

    【解决方案4】:

    如果你真的想要 _.pluck 支持回来,你可以使用 mixin:

    const _ = require("lodash")
    
    _.mixin({
        pluck: _.map
    })
    

    因为map 现在支持将字符串(“迭代器”)作为参数而不是函数。

    【讨论】:

    • pluck != map。 Pluck 让你传入一个字符串,和给function (record) { return(record[that_string]) } 一样
    • @BrianUnderwood 谢谢!我重申一下:_.map 如果使用得当,可以用作功能等价物。
    【解决方案5】:

    对于提取单个或多个属性:

    _.mixin({
        properties: (paths) =>
                (obj) => paths.reduce((memo, path) => [...memo, obj[path]], []),
        pluck: (obj, ...keys) => _.map(obj, _.flatten(keys).length > 1
                                        ? _.properties(_.flatten(keys))
                                        : (o) => o[keys[0]])
    })
    
    var stooges = [{name: 'moe', age: 40}, {name: 'larry', age: 50}, {name: 'curly', age: 60}];
    
    // underscore compatible usage
    _.pluck(stooges, 'name');
    => ["moe", "larry", "curly"]
    
    // multiple property usage
    _.pluck(stooges, 'name', 'age')
    => [["moe",40], ["larry",50], ["curly",60]]
    
    // alternate usage
    _.pluck(stooges, ['name', 'age']) 
    => [["moe",40], ["larry",50], ["curly",60]]
    

    【讨论】:

      【解决方案6】:

      或者尝试像这样的纯 ES6 nonlodash 方法

      const reducer = (array, object) => {
        array.push(object.a)
        return array
      }
      
      var objects = [{ 'a': 1 }, { 'a': 2 }];
      objects.reduce(reducer, [])
      

      【讨论】:

      • 这太复杂了,你可以做objects.map(object => object.a)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-14
      • 1970-01-01
      • 1970-01-01
      • 2023-02-20
      • 2020-07-01
      • 2015-06-29
      • 2012-09-05
      相关资源
      最近更新 更多