Angular 在传递过滤值时更新扫描累加器

Angular 在传递过滤值时更新扫描累加器,angular,typescript,rxjs,Angular,Typescript,Rxjs,我正在尝试使用扫描来维护一个数据数组并进行一些过滤 someObservable$.pipe( filter(initial=> initial.length !== 0), scan((acc, curr) => curr.filter(x => !acc.includes(x))), map(data => etc...) ) 我想更新acc值,以便它以某种方式维护已通过的所有数据的综合列表,但只将过滤后的值输出到映射。 所以如果通过的第一个列表是

我正在尝试使用扫描来维护一个数据数组并进行一些过滤

someObservable$.pipe(
   filter(initial=> initial.length !== 0),
   scan((acc, curr) => curr.filter(x => !acc.includes(x))),
   map(data => etc...)
)
我想更新acc值,以便它以某种方式维护已通过的所有数据的综合列表,但只将过滤后的值输出到映射。 所以如果通过的第一个列表是 [1,2,3]第二组是[2,3,4],在第一次通过时,我希望数据是[1,2,3],并且acc=[1,2,3],在第二次通过时,数据是[4],但是acc=[1,2,3,4]

我是以一种迟钝的方式来做这件事的?我觉得可能有更好的方法。

我会在扫描函数中使用类作为累加器

我在rxjs文档中查找了任何内置的替代方案,但找不到任何适合这种情况的替代方案

请看一看这个例子

var subject=新的rxjs.subject; const obs=subject.pipe rxjs.operators.scanacc,当前=>{current.mappr=>acc.addpr;返回acc;},新集合//1解决方案 //rxjs.operators.scanacc,当前=>[…新设置[…acc,…当前]]//2解决方案 //rxjs.operators.scanacc,current=>[…acc,…current.filterpr=>!acc.includespr]//3解决方案-如果无法使用Set //rxjs.operators.scanacc,current=>acc.concatcurrent.filterpr=>!acc.includespr//4解决方案-如果无法使用设置和排列 ; const subscription=obs.subscriptbeval=>{ 控制台日志[…val]; }; subject.next[1,2,3]; subject.next[2,3,4]; 我将在扫描函数中使用累加器类

我在rxjs文档中查找了任何内置的替代方案,但找不到任何适合这种情况的替代方案

请看一看这个例子

var subject=新的rxjs.subject; const obs=subject.pipe rxjs.operators.scanacc,当前=>{current.mappr=>acc.addpr;返回acc;},新集合//1解决方案 //rxjs.operators.scanacc,当前=>[…新设置[…acc,…当前]]//2解决方案 //rxjs.operators.scanacc,current=>[…acc,…current.filterpr=>!acc.includespr]//3解决方案-如果无法使用Set //rxjs.operators.scanacc,current=>acc.concatcurrent.filterpr=>!acc.includespr//4解决方案-如果无法使用设置和排列 ; const subscription=obs.subscriptbeval=>{ 控制台日志[…val]; }; subject.next[1,2,3]; subject.next[2,3,4];
如果我猜对了您的意图,那么以下代码就足够了:

static acc = new Set<number>();
...
return someObservable$.pipe(
  map( list => {
    let res = [];
    list.forEach( e => {
      if ( !acc.has( e ) ) {
        acc.set( e );
        res.push( e );
      }
    } );
    return res;
  } ),
  filter( list => list.length > 0 )
);

如果我猜对了您的意图,那么以下代码就足够了:

static acc = new Set<number>();
...
return someObservable$.pipe(
  map( list => {
    let res = [];
    list.forEach( e => {
      if ( !acc.has( e ) ) {
        acc.set( e );
        res.push( e );
      }
    } );
    return res;
  } ),
  filter( list => list.length > 0 )
);