• 数学操作符
    • max
    • min
    • sum
    • average

    数学操作符

    max

    1. let stream$ = Rx.Observable.of(5,4,7,-1)
    2. .max();

    发出的值是7。这个操作符的功能显而易见,只提供一个最大值。还有不同的方式来调用它,可以传入一个 comparer 函数:

    1. function comparer(x,y) {
    2. if( x > y ) {
    3. return 1;
    4. } else if( x < y ) {
    5. return -1;
    6. } else return 0;
    7. }
    8. let stream$ = Rx.Observable.of(5,4,7,-1)
    9. .max(comparer);

    在这个案例中,我们定义了 comparer 函数,它会在底层运行排序算法,我们所要做的只是帮助它判断是 大于等于 还是 小于。还可以使用对象进行比较,概念都是一样的:

    1. function comparer(x,y) {
    2. if( x.age > y.age ) {
    3. return 1;
    4. } else if( x.age < y.age ) {
    5. return -1;
    6. } else return 0;
    7. }
    8. let stream$ = Rx.Observable.of({ name : 'chris', age : 37 }, { name : 'chross', age : 32 })
    9. .max(comparer);

    因为我们在 comparer 中声明了要比较什么属性,所以第一条数据会被留下作为结果。

    min

    minmax() 操作符基本一样,只是返回的是最小值。

    sum

    sum() 操作符已经不复存在,但是我们可以使用 reducer() 来完成同样的功能,像这样:

    1. let stream$ = Rx.Observable.of(1,2,3,4)
    2. .reduce((accumulated, current) => accumulated + current )

    同样也适用于对象,只要我们定义好 reduce() 函数应该怎么做,像这样:

    1. let objectStream$ = Rx.Observable.of( { name : 'chris' }, { age : 11 } )
    2. .reduce( (acc,curr) => Object.assign({}, acc,curr ));

    这会把所有对象合并为一个对象。

    average

    RxJS 5中取消了 average() 操作符,但是仍可以使用 reduce() 来完成同样的功能

    1. let stream$ = Rx.Observable.of( 3, 6 ,9 )
    2. .map( x => { return { sum : x, counter : 1 } } )
    3. .reduce( (acc,curr) => {
    4. return Object.assign({}, acc, { sum : acc.sum + curr.sum ,counter : acc.counter + 1 })
    5. })
    6. .map( x => x.sum / x.counter )

    我承认这个实现有一点绕,一旦你理解了起初调用的 map(),那么 reduce() 就很好理解了,Object.assign() 一如既往的是个好助手。