首页 > 解决方案 > 如果在 rxjs 中没有按顺序重复 3 次,如何跳过 0 值

问题描述

我有以下数据流

1 > 4 > 0 > 3 > 1 > 0 > 0 > 0 > 1 > 2 > 0 > 0 > 0 > 0 > 0 > 0

我只想0在它连续重复 3 次或更多时才被发出,所以预期的结果将类似于

1 > 4 > 3 > 1 > 0 > 1 > 2 > 0

我怎么能在 rxjs 中做到这一点?

标签: javascriptrxjs

解决方案


您可能希望按照以下示例实现它:

const { from } = rxjs;
const { scan, filter, map} = rxjs.operators;


const input = [
    1, 4, 0, 3, 1, 0, 0, 0, 
    1, 2, 0, 0, 0, 0, 0, 0,
    2, 0, 2, 4, 0, 0, 3, 9,
    4, 3, 0, 0, 0, 0, 0, 0,
];

from(input).pipe(
    scan(({ counter }, current) => {

        if (current === 0) return { current, counter: ++counter, emit: counter == 3 }
        else return { current, counter: 0, emit: true };

    }, { emit: false, counter: 0, current: undefined }),

    filter(x => x.emit), 

    map(x => x.current) 
)
.subscribe(console.log)
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.6.2/rxjs.umd.min.js"></script>


推荐阅读