我有以一定速率发出值的代码:
let source = zip (
interval(150) ,
from ([0,1,1,1,1,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3])
) .subscribe(a=>console.log(a))
我想找到值 - 在N
值已经解决之后(这意味着 - N
重复相同的值)。
例如,如果N=5
,那么我需要第一次找到它产生5个相同的值。 (并发出该值。)
题:
如何检测N个相同的值并发出该值(并完成流)?
所以这里的期望值是3
,因为它是5个相同值的第一个系列:
你可以使用bufferCount(N, 1)
,其中1
告诉bufferCount
在每次发射后发出它的缓冲区,这意味着它将发出N
项目的数组。然后检查所有这些是否相同和完整。
const N = 5
from ([0,1,1,1,1,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3])
.pipe(
bufferCount(N, 1),
filter(buffer => buffer.length === N && buffer.every(i => i === buffer[0])),
take(1),
map(buffer => buffer[0]),
)
.subscribe(console.log);
现场演示:https://stackblitz.com/edit/rxjs6-demo-xzb5so?file=index.ts
这有点难看,但这会奏效
from([0,1,1,1,1,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3]).pipe(
scan((acc, cur) => {
if (cur !== acc.lastValue) {
acc.count = 0;
acc.lastValue = cur;
} else {
acc.count++;
acc.lastValue = cur;
if (acc.count >= acc.nValues) {
acc.found = true;
}
}
return acc;
},
{
count: 0,
lastValue: undefined,
nValues: 5,
found: false
}),
filter(result => result.found),
map(result => result.lastValue),
take(1)
).subscribe(console.log)