GBr*_*669 17
别再用勇气了!
Pluck
现在计划在 RxJS v8 中删除。你知道是什么原因吗?
因为在 JS 中添加了可选链运算符之后,它本质上只是Map
.
那么两者有什么区别呢?两者都用于“转换”将要发出的数据。
Map
可用于...映射可观察的发射(就像我们在 JS 中使用 所做的那样Array.prototype.map
),而Pluck
用于选择/选取要发射的属性(无需发射我们不关心的属性,从而提高性能) 。
但即使在可选链接运算符之前,您也可以只映射属性而不是提取它们。结果和性能大致相同。
pluck('prop')
Run Code Online (Sandbox Code Playgroud)
只是以下的简写:
map(x => x.prop)
Run Code Online (Sandbox Code Playgroud)
那么,实施的原因是什么Pluck
?
它基本上是为了实现路径遍历安全性而实现的,这意味着如果未定义属性,您可以尝试提取嵌套属性而不会出现错误(Map 会抛出错误):
pluck('foo', 'bar', 'baz'); // no error if foo is not defined
map(x => x.foo.bar.baz) // error if foo is not defined
Run Code Online (Sandbox Code Playgroud)
使用可选链接,这种优势不再存在,因为我们可以这样做:
map(x => x?.foo?.bar?.baz)
Run Code Online (Sandbox Code Playgroud)
Pluck
这是该操作符将来被弃用和删除的主要原因。另一个重要原因是 pluck 的 TS 键入相当复杂,并且不如映射运算符那么健壮。
在GitHub中获取该信息:弃用的提交Pluck
已经快一年了,但我仍然没有在文档中看到任何关于未来弃用的警告,因此我在这里发帖,因为我认为了解这是一件好事。由于这个原因我已经停止采摘了。
Sim*_*ver 12
文档说
Pluck:与map类似,但仅用于选择每个发射对象的嵌套属性之一.
因此,假设你有
[{ name: 'Joe', age: 30, job: { title: 'Developer', language: 'JavaScript' },
{ name: 'Sarah', age: 35 }]
Run Code Online (Sandbox Code Playgroud)
你想要一份所有职位名单.
使用map
会有点痛苦(因为它的可空性job
),但是使用'pluck'可以编写pluck('job', 'title')
并且它将遍历寻找的树job.title
- 如果job
为null 则不会失败.
示例来自:https://www.learnrxjs.io/operators/transformation/pluck.html
https://jsfiddle.net/btroncone/n592m597/
正如@mgm87 所说,您可以使用map
. 相反,pluck
只是取一个值。
例如,使用 map 您可以执行以下操作:
this.http.get('...some api url to get a user...')
.map(response => response.json())
.map(user => user.age > 18 ? 'major': 'minor')
.do(isMajorOrMinor => console.log(isMajorOrMinor))
Run Code Online (Sandbox Code Playgroud)
因此,您甚至可以有条件地在链中操作您的数据。
但是,对我来说,最大的区别之一是map is typed
. 这意味着如果您有一些数据,请说:
interface IUser {
name: string;
age: number;
dogs: IDog[];
}
Run Code Online (Sandbox Code Playgroud)
你会在某个时候收到一个用户,你想从中获取他的狗:
user$
.map(user => user.dogs)
.do(dogs => ...) // here, you do NOT need to precise (dogs: IDog[]) because Typescript will make a type inference
Run Code Online (Sandbox Code Playgroud)
这就是为什么我总是使用 map 甚至只是“提取”一些数据。
归档时间: |
|
查看次数: |
3591 次 |
最近记录: |