Functional programming 创建通过筛选器的连续值流

Functional programming 创建通过筛选器的连续值流,functional-programming,rxjs,reactive-programming,reactivex,Functional Programming,Rxjs,Reactive Programming,Reactivex,假设我有一系列的数字 ---1---1---1---0---0---1---1---0---> 我想得到一个新的数组流,其中包含像这样连续的1 ---[1,1,1]——[1,1]——> 我曾想过使用scan函数,但它只发出一个值,我读过关于bufferToggle的文章,但文档中只对定时观测使用它。有任何功能可以做到这一点吗?一种可能的方法是使用scan和pairwise操作符 使用两两法,您可以将N-1th发射与Nth发射进行比较 console.clear(); var source=Rx

假设我有一系列的数字

---1---1---1---0---0---1---1---0--->

我想得到一个新的数组流,其中包含像这样连续的1

---[1,1,1]——[1,1]——>


我曾想过使用scan函数,但它只发出一个值,我读过关于bufferToggle的文章,但文档中只对定时观测使用它。有任何功能可以做到这一点吗?

一种可能的方法是使用
scan
pairwise
操作符

使用两两法,您可以将
N-1
th发射与
N
th发射进行比较

console.clear();
var source=Rx.可观测值(1,1,1,0,0,1,1,0);
来源
.concat(Rx.Observable.of(0))//对于源以1完成的情况
.扫描(功能(附件x){
//遇到0时将累加器重置为空数组
如果(x==0){
返回[];
}否则{
根据concat([x])返回;
}
}, [])
.成对
//当累积值从大于0的长度开始时进行筛选
//到0,你就知道你已经达到了0
.filter((对)=>对[0]。长度>0&&对[1]。长度===0)
//取一对中的第一个元素,因为它具有您感兴趣的结果
.map((对)=>对[0])
.subscribe(console.log)

可以使用源本身作为信号-它使用可观测值来控制缓冲区的打开和关闭

但是,您必须小心订阅源的顺序。特别是,在
bufferToggle
observable subscribes之前,必须订阅用于发出缓冲区打开和关闭信号的observable

这可以使用
发布
主题
来完成,如下所示:

const source=Rx.Observable.of(1,1,1,0,0,1,1,0);
const published=source.publish();
const signal=新的接收对象();
发布。订阅(信号);
const buffered=published.bufferToggle(
信号
.startWith(0)
.成对
.filter(([prev,last])=>(prev==0)和&(last==1)),
()=>signal.filter(值=>value==0)
);
subscribe(值=>console.log(值));
published.connect()
。作为控制台包装{最大高度:100%!重要;顶部:0;}

很好的解决方案。不过,我会在
.scan
之前添加一个
.concat(Observable.of(0))
,否则如果源流以1结尾,结果将不会发出,例如,源
Observable.of(1,1,1)
将不会发出任何东西。祝您好运@ehrencrona。更新。