Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使.scan()仅聚合未完成序列中最近发出的数组_Javascript_Arrays_Reactive Programming_Rxjs_Rxjs5 - Fatal编程技术网

Javascript 如何使.scan()仅聚合未完成序列中最近发出的数组

Javascript 如何使.scan()仅聚合未完成序列中最近发出的数组,javascript,arrays,reactive-programming,rxjs,rxjs5,Javascript,Arrays,Reactive Programming,Rxjs,Rxjs5,我需要在一个可观察的数组中转换和聚合元素。序列是开放的,可能永远不会完成(基于网络) 我目前正在使用以下代码: const numbers = [1,2,3]; const numbers$ = new Rx.Subject(); const output = numbers$ .flatMap(n => n) .map(n => n*n) .scan((acc, x) => acc.concat([x]), []) .subscribe(n => {

我需要在一个可观察的数组中转换和聚合元素。序列是开放的,可能永远不会完成(基于网络)

我目前正在使用以下代码:

const numbers = [1,2,3];
const numbers$ = new Rx.Subject();

const output = numbers$
  .flatMap(n => n)
  .map(n => n*n)
  .scan((acc, x) => acc.concat([x]), [])
  .subscribe(n => { console.log(n); });

numbers$.next(numbers);

setTimeout(() => {
  numbers$.next([5,6,7])
}, 1000);
目前,发射了多个阵列,最近发射的值当前为
[1、4、9、25、36、49]
。但是,我只希望这些值在同一输入数组中被平方

也就是说,我需要输出可观测到的正好发射两个数组:
[1,4,9]
[25,36,49]


如何做到这一点?

这应该是您正在寻找的:

const output = numbers$
    .map((a) => a.map(n => n * n))
    .subscribe(n => { console.log(n); });
编辑:如果不想使用
Array.map
,可以改用RxJS

您可以将
Array.map
替换为一个可观察值,该可观察值将值平方,并将其还原为一个数组。这可以扩展到包括
distinct
或其他RxJS操作符(根据您的评论):

您发布的解决方案:

const output = numbers$
    .flatMap(n => n)
    .map(n => n*n)
    .buffer(numbers$.delay(1))
    .subscribe(n => { console.log(n); });

是基于时间的,阵列未合并的唯一原因是第一次
下一次
调用与第二次调用之间的间隔超过了一毫秒。

这应该是您要查找的:

const output = numbers$
    .map((a) => a.map(n => n * n))
    .subscribe(n => { console.log(n); });
编辑:如果不想使用
Array.map
,可以改用RxJS

您可以将
Array.map
替换为一个可观察值,该可观察值将值平方,并将其还原为一个数组。这可以扩展到包括
distinct
或其他RxJS操作符(根据您的评论):

您发布的解决方案:

const output = numbers$
    .flatMap(n => n)
    .map(n => n*n)
    .buffer(numbers$.delay(1))
    .subscribe(n => { console.log(n); });

是基于时间的,阵列未合并的唯一原因是第一次
下一次
调用与第二次调用之间的间隔超过了一毫秒。

看起来这就是您需要的:


看起来这正是您需要的:


我不喜欢使用Array.prototype.map()函数,而是坚持使用RxJS。也就是说,更复杂的转换,如
.distinct()
,也可以完成。使用带有嵌套的.from()的mergeMap/flatMap是正确的解决方案。我还利用
.toArray()
而不是最后的.reduce()/.scan()将值打包回数组中。我不喜欢使用array.prototype.map()函数,而是坚持使用RxJS。也就是说,更复杂的转换,如
.distinct()
,也可以完成。使用带有嵌套的.from()的mergeMap/flatMap是正确的解决方案。我还利用
.toArray()
而不是最后的.reduce()/.scan()将值打包回数组。