gpt4 book ai didi

javascript - RxJS - 最多缓冲 n 项并发出这些缓冲区

转载 作者:行者123 更新时间:2023-11-30 00:11:45 24 4
gpt4 key购买 nike

我正在尝试从流中缓冲最多 n(假设 5)个项目,但发出部分填充的数组,直到缓冲区已满。

假设我有一个像这样的流:

const stream = Rx.Observable.range(0, 6);

我要发射:

[0]
[0, 1]
[0, 1, 2]
[0, 1, 2, 3]
[0, 1, 2, 3, 4]
[1, 2, 3, 4, 5]

到目前为止我有两个解决方案,我想知道哪个更“Rx 方式”。

如果元素多于n个,则扫描并移位累加器:

stream.scan((acc, current) => {
acc.push(current);

if (acc.length > 5) {
acc.shift();
}

return acc;
}, []);

或者在不超过 5 个元素时扫描流并与缓冲区合并:

stream.scan((acc, current) => {
acc.push(current);
return acc;
}, [])
.takeWhile((x) => { return x.length < 5 })
.merge(stream.bufferWithCount(5));

哪种方法更好,更符合 Rx?根据 jsperf 的快速测试,在性能方面移动数组比合并快 60%。

或者有更好的解决方案?

最佳答案

第一种方法看起来相当不错。我还会将 acc 视为不可变数组。简单地说,不使用 pushshift 就做你正在做的事情。方法如下:

stream.scan((acc, current) => [...acc.slice(acc.length > 5 ? 1 : 0), current], []);

关于javascript - RxJS - 最多缓冲 n 项并发出这些缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36199167/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com