当前位置:   article > 正文

转化类操作符:map、mapTo和pluck

mapto

map介绍:

  1. import {Observable} from 'rxjs/Observable';
  2. import 'rxjs/add/observable/of';
  3. import 'rxjs/add/operator/map';
  4. // 第一种
  5. const source$ = Observable.of(3, 1, 4);
  6. const mapFunc = function(value, index) {
  7. return `${value} ${this.separator} ${index}`;
  8. };
  9. const context = {separator: ':'};
  10. const result$ = source$.map(mapFunc, context);
  11. result$.subscribe(
  12. console.log,
  13. null,
  14. () => console.log('complete')
  15. );
  16. // 解释说明:mapFunc这个函数是map的第一个参数,充当project的功能,同时,map还有第二个参数context对象,如果用上这个参数,那么mapFunc在每次执行的时候,this就是map的这个参数context,所以,在mapFunc中this.separator的值就是冒号(:)
  17. // 第二种
  18. const source$ = Observable.of(3, 1, 4);
  19. const context = {separator: ':'};
  20. const mapFunc = (function (separator) {
  21. return function(value, index) {
  22. return `${value} ${separator} ${index}`;
  23. };
  24. })(context.separator)
  25. const result$ = source$.map(mapFunc);
  26. result$.subscribe(
  27. console.log,
  28. null,
  29. () => console.log('complete')
  30. );
  31. // 解释说明:并不建议使用第一种方式,按照函数式编程的原则,应该尽量让函数成为纯函数,如果一个函数的执行依赖于this,那么就难以预料这个函数的执行结果,并不是什么好事。所以,我们知道map有这个功能,但要尽量避免使用它
  32. // 利用一个立即执行的函数产生一个新的函数mapFunc,这样既定制了mapFunc中使用的separator,又保持了函数体内代码的纯洁

运行结果:

map源码介绍:

  1. var map_1 = require('../operators/map');
  2. function map(project, thisArg) {
  3. return map_1.map(project, thisArg)(this);
  4. }
  5. // map_1
  6. export declare function map<T, R>(this: Observable<T>, project: (value: T, index: number) => R, thisArg?: any): Observable<R>;

 mapTo介绍:

  1. import {Observable} from 'rxjs/Observable';
  2. import 'rxjs/add/observable/of';
  3. import 'rxjs/add/operator/mapTo';
  4. // import 'rxjs/add/operator/map';
  5. const source$ = Observable.of(3, 1, 4);
  6. // 使用mapTo
  7. const result$ = source$.mapTo('ABC');
  8. // 使用map
  9. // const result$ = source$.map(() => 'ABC');
  10. result$.subscribe(
  11. console.log,
  12. null,
  13. () => console.log('complete')
  14. );

运行结果:

mapTo源码介绍:

  1. Observable.prototype.mapTo = function (value) {
  2. return this.map(x => value);
  3. };

pluck介绍:

  1. import {Observable} from 'rxjs/Observable';
  2. import 'rxjs/add/observable/of';
  3. import 'rxjs/add/operator/pluck';
  4. const source$ = Observable.of(
  5. {name: 'RxJS', version: 'v4'},
  6. {name: 'React', version: 'v15'},
  7. {name: 'React', version: 'v16'},
  8. {name: 'RxJS', version: 'v5'}
  9. );
  10. const result$ = source$.pluck('name');
  11. result$.subscribe(
  12. console.log,
  13. null,
  14. () => console.log('complete')
  15. );

运行结果:

pluck源码介绍:

  1. var pluck_1 = require('../operators/pluck');
  2. function pluck() {
  3. var properties = [];
  4. for (var _i = 0; _i < arguments.length; _i++) {
  5. properties[_i - 0] = arguments[_i];
  6. }
  7. return pluck_1.pluck.apply(void 0, properties)(this);
  8. }
  9. // pluck_1
  10. export declare function pluck<T, R>(this: Observable<T>, ...properties: string[]): Observable<R>;

 pluck优点:能够自动处理获取不存在的字段,返回undefined。如使用map,将抛出一个错误:throw new TypeError。。。。

  1. import {Observable} from 'rxjs/Observable';
  2. import 'rxjs/add/observable/of';
  3. import 'rxjs/add/operator/pluck';
  4. const source$ = Observable.of(
  5. {name: 'RxJS', version: 'v4'},
  6. {name: 'React', version: 'v15'},
  7. {name: 'React', version: 'v16'},
  8. {name: 'RxJS', version: 'v5'}
  9. );
  10. const result$ = source$.pluck('age');
  11. result$.subscribe(
  12. console.log,
  13. null,
  14. () => console.log('complete')
  15. );

运行结果:

 从以上demo可以看到:map是映射操作之母,mapTo和pluck都可以基于map实现。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/805483
推荐阅读
相关标签
  

闽ICP备14008679号