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 - '_' 指的是 UMD 全局并且 lodash.js 不是模块错误
import * as _ from 'lodash' 和 import indexOf from 'lodash' 之间是不是存在性能差异