PullJ和Map之间的RXJS区别

时间:2017-09-18 20:57:42

标签: javascript angular typescript rxjs

我试图理解RXJS采集和地图之间的区别。

任何人都可以帮我吗?

赞赏

5 个答案:

答案 0 :(得分:7)

文档说

  

Pluck:喜欢地图,但仅限于选择其中一个嵌套   每个发射物体的属性

因此,假设你有

[{ name: 'Joe', age: 30, job: { title: 'Developer', language: 'JavaScript' },
{ name: 'Sarah', age: 35 }]

你想要一份所有职位名单。

使用map会有点痛苦(因为job的可空性),但是使用'pluck'可以编写pluck('job', 'title')并且它将遍历树寻找{ {1}} - 如果job.title为空,则不会失败。

示例摘自:https://www.learnrxjs.io/operators/transformation/pluck.html

https://jsfiddle.net/btroncone/n592m597/

答案 1 :(得分:4)

正如@ mgm87所说,您可以使用map执行操作。 相反,pluck只是取值。

例如,使用地图,您可以执行以下操作:

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))

因此,即使有条件,您也可以在链中操纵数据。

但对我来说,最大的区别之一是map is typed。 这意味着如果您有一些数据,请说:

interface IUser {
  name: string;
  age: number;
  dogs: IDog[];
}

你在某个时候收到了一个用户,你想从中得到他的狗:

user$
  .map(user => user.dogs)
  .do(dogs => ...) // here, you do NOT need to precise (dogs: IDog[]) because Typescript will make a type inference

这就是为什么我总是使用地图甚至只是"采摘"一些数据。

答案 2 :(得分:2)

停止使用 pluck!

Pluck 现在计划在 RxJS v8 中移除。 你知道是什么原因吗?

因为在 JS 中添加 optional chaining operator 后,它本质上只是 Map 的弱版本。

那么两者有什么区别呢? 两者都用于“转换”将要发出的数据。 Map 可用于...映射一个可观察的发射(就像我们在 JS 中使用 Array.prototype.map 所做的那样),而 Pluck 用于选择/选择要发出的属性(不必发出我们不关心的属性,从而提高性能)。

但即使在可选链运算符之前,您也可以只映射属性而不是提取它们。结果和性能大致相同。

pluck('prop')

只是以下内容的简写:

map(x => x.prop)

那么,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

使用可选链接,这种优势不再存在,因为我们可以这样做:

map(x => x?.foo?.bar?.baz)

这就是 Pluck 运算符将来会被弃用和删除的主要原因。 另一个重要原因是 pluck 的 TS 类型非常复杂,而且不如 map 操作符健壮。

GitHub 中获得了该信息: Pluck 弃用的提交已经快一年了,但我仍然没有在文档中看到任何关于未来弃用的警告,因此我在这里发布,因为我认为这是一件好事。出于这个原因,我已经停止采摘了。

答案 3 :(得分:0)

Map可以对每个发射值执行操作。 http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-map https://www.learnrxjs.io/operators/transformation/map.html

// value from observable = 10
map(x => 10*x)
// value from map = 100

Pluck只选择每个发射值的嵌套属性之一。 http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-pluck https://www.learnrxjs.io/operators/transformation/pluck.html

// value from observable = {p = 10, w = 100}
pluck('p')
// value from pluck = 10

答案 4 :(得分:-3)

它们非常相似,但据我所知,map使用数组,而pluck则从对象中获取值。

This is the place to go for specifics.