Javascript 用RXJS取N个相同的数字?

Javascript 用RXJS取N个相同的数字?,javascript,rxjs,Javascript,Rxjs,我有以一定速率发出值的代码: 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个相同值的时间。(并发出该值。) 问题:

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

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);

现场演示:

您可以使用
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);

现场演示:

有点难看,但这会奏效

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)

这有点难看,但这样行得通

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)

我想我不明白你想要什么。源代码可能会产生
[3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,1,1,1,2,3,3,3,3,3,3,3,3]
。所有这3个在开始是因为初始化过程,我不想让他们计数。我想让它们只在有任何变化时才计数。看看所有的红色箭头:它们是值变化的“变化点”。我只需要在一个变化点之后开始检测。那么-是否有可能在变更点后产生黄色的
3
?最初的
3
不好,因为它们前面没有变化点。我只想处理前面有任何更改点的
3
(我知道这不包括在问题中,但面临一个初始化问题,它在开始时会产生许多相同的值。我不需要这些值。我只需要在任何更改点之后才需要这些值。我想你可以使用
take(2),takeLast(1)
这将忽略第一个序列谢谢。顺便说一句-我想我用这个解决方案得到了它:所以第一个相同的流数据不被计算。只有在任何更改之后-我才开始计算:我想我不明白你想要什么源可能会产生
[3,3,3,3,3,3,3,3,3,3,3,3,3,0,1,1,1,2,3,3,3,3,3,3,3,3]
。开始时的所有3个都是因为初始化过程,我不想让它们计数。我只想让它们在有任何变化时计数。看看所有红色箭头:它们是“变化点”其中值发生变化。我只需要在一个变化点之后开始检测。那么-是否有可能在一个变化点之后产生黄色的
3
?初始的
3
不好,因为它们前面没有变化点。我只想处理前面有任何变化点的
3
(我知道这不包括在问题中,但面临一个初始化问题,在开始时确实会产生许多相同的值。我不需要这些值。我只需要在任何更改点之后才需要这些值。我想你可以使用
take(2),takeLast(1)
这将忽略第一个序列谢谢。顺便说一句-我想我用这个解决方案得到了它:所以第一个相同的流数据不被计数。只有在任何更改之后-我开始计数: