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