PullJ和Map之间的RXJS区别

npa*_*t89 7 javascript rxjs typescript angular

我想了解RXJS采摘和地图之间的区别.

谁能帮我这个?

赞赏

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/


max*_*992 9

正如@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 甚至只是“提取”一些数据。