0

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

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

在此处输入图像描述

在线演示

4

2 回答 2

5

您可以使用bufferCount(N, 1)where 1tellbufferCount在每次发射后发射其缓冲区,这意味着它将发射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

于 2018-09-12T13:54:18.230 回答
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)
于 2018-09-12T13:56:26.923 回答