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

本文详细介绍了RxJS中的map、mapTo和pluck操作符的用法及源码解析。map作为映射操作的基础,可以用于转换每个值;mapTo则简单地将每个值映射为指定的常量;pluck则专门用于从对象中提取指定属性。示例代码展示了它们的使用方式及运行结果,强调了函数纯洁性和错误处理的重要性。
摘要由CSDN通过智能技术生成

map介绍:

import {Observable} from 'rxjs/Observable';
import 'rxjs/add/observable/of';
import 'rxjs/add/operator/map';

// 第一种
const source$ = Observable.of(3, 1, 4);
const mapFunc = function(value, index) { 
  return `${value} ${this.separator} ${index}`;
};
const context = {separator: ':'};
const result$ = source$.map(mapFunc, context);
result$.subscribe(
  console.log,
  null,
  () => console.log('complete')
);

// 解释说明:mapFunc这个函数是map的第一个参数,充当project的功能,同时,map还有第二个参数context对象,如果用上这个参数,那么mapFunc在每次执行的时候,this就是map的这个参数context,所以,在mapFunc中this.separator的值就是冒号(:)


// 第二种
const source$ = Observable.of(3, 1, 4);
const context = {separator: ':'};
const mapFunc = (function (separator) {
  return function(value, index) {
    return `${value} ${separator} ${index}`;
  };
})(context.separator)
const result$ = source$.map(mapFunc);
result$.subscribe(
  console.log,
  null,
  () => console.log('complete')
);

// 解释说明:并不建议使用第一种方式,按照函数式编程的原则,应该尽量让函数成为纯函数,如果一个函数的执行依赖于this,那么就难以预料这个函数的执行结果,并不是什么好事。所以,我们知道map有这个功能,但要尽量避免使用它
// 利用一个立即执行的函数产生一个新的函数mapFunc,这样既定制了mapFunc中使用的separator,又保持了函数体内代码的纯洁

运行结果:

map源码介绍:

var map_1 = require('../operators/map');

function map(project, thisArg) {
    return map_1.map(project, thisArg)(this);
}

// map_1
export declare function map<T, R>(this: Observable<T>, project: (value: T, index: number) => R, thisArg?: any): Observable<R>;

 mapTo介绍:

import {Observable} from 'rxjs/Observable';
import 'rxjs/add/observable/of';
import 'rxjs/add/operator/mapTo';

// import 'rxjs/add/operator/map';

const source$ = Observable.of(3, 1, 4);
// 使用mapTo
const result$ = source$.mapTo('ABC');

// 使用map
// const result$ = source$.map(() => 'ABC');

result$.subscribe(
  console.log,
  null,
  () => console.log('complete')
);

运行结果:

mapTo源码介绍:

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

pluck介绍:

import {Observable} from 'rxjs/Observable';
import 'rxjs/add/observable/of';
import 'rxjs/add/operator/pluck';

const source$ = Observable.of(
  {name: 'RxJS', version: 'v4'},
  {name: 'React', version: 'v15'},
  {name: 'React', version: 'v16'},
  {name: 'RxJS', version: 'v5'}
);
const result$ = source$.pluck('name');
result$.subscribe(
  console.log,
  null,
  () => console.log('complete')
);

运行结果:

pluck源码介绍:

var pluck_1 = require('../operators/pluck');

function pluck() {
    var properties = [];
    for (var _i = 0; _i < arguments.length; _i++) {
        properties[_i - 0] = arguments[_i];
    }
    return pluck_1.pluck.apply(void 0, properties)(this);
}


// pluck_1
export declare function pluck<T, R>(this: Observable<T>, ...properties: string[]): Observable<R>;

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

import {Observable} from 'rxjs/Observable';
import 'rxjs/add/observable/of';
import 'rxjs/add/operator/pluck';

const source$ = Observable.of(
  {name: 'RxJS', version: 'v4'},
  {name: 'React', version: 'v15'},
  {name: 'React', version: 'v16'},
  {name: 'RxJS', version: 'v5'}
);
const result$ = source$.pluck('age');
result$.subscribe(
  console.log,
  null,
  () => console.log('complete')
);

运行结果:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值