我试图理解RXJS采集和地图之间的区别。
任何人都可以帮我吗?
赞赏
答案 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
答案 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则从对象中获取值。