用RXJS取N个相同的数字?

问题描述 投票:0回答:2

我有以一定速率发出值的代码:

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个相同值的第一个系列:

enter image description here

Online demo

javascript rxjs
2个回答
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


1
投票

这有点难看,但这会奏效

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)
© www.soinside.com 2019 - 2024. All rights reserved.