Lodash _.pluck 怎么了?

Posted

技术标签:

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

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

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

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

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

【问题讨论】:

lodash.com/docs#pick lodash.com/docs#result 【参考方案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)

以上是关于Lodash _.pluck 怎么了?的主要内容,如果未能解决你的问题,请参考以下文章

Lodash - '_'指的是UMD全局,而lodash.js不是模块错误

lodash常用方法

Lodash - '_' 指的是 UMD 全局并且 lodash.js 不是模块错误

import * as _ from 'lodash' 和 import indexOf from 'lodash' 之间是不是存在性能差异

Lodash _.debounce 具有用于独特参数变体的单独队列

Lodash _.filter 函数必须只满足 ONE 条件