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)
这将忽略第一个序列谢谢。顺便说一句-我想我用这个解决方案得到了它:所以第一个相同的流数据不被计数。只有在任何更改之后-我开始计数: