有人知道为什么映射后此过滤器不起作用吗?
当我这样做时:
this.cacheService.getMainCache().pipe( map(val => val.list)).subscribe((val) => {
console.log(val);
}, (error) => {
console.log('Error: ', error);
});
我需要过滤该数组并仅返回一个,其name属性等于某个字符串的那个数组,当我将filter运算符添加到管道中时,什么也没发生,我想没有任何内容被过滤:
this.cacheService.getMainCache().pipe(map(val => val.list), filter((item: any) => item.name == 'profile')).subscribe((val) => {
console.log(val);
}, (error) => {
console.log('Error: ', error);
});
我在这里做什么错了?
答案 0 :(得分:3)
您的代码段问题是项目类型。您希望过滤器功能可以过滤项目。但是在您的情况下,item是整个数组本身。由于数组没有属性“名称”,因此订阅服务器上没有任何显示。 我建议使用正确的键入。
您有两个选择:
this.cacheService.getMainCache().pipe(
map(val => val.list.filter((item: any) => item.name == 'profile'))
).subscribe((val) => {
console.log(val);
}, (error) => {
console.log('Error: ', error);
});
this.cacheService.getMainCache().pipe(
map(val => val.list),
concatAll(),
filter((item: any) => item.name == 'profile')),
toArray()
).subscribe((val) => {
console.log(val);
}, (error) => {
console.log('Error: ', error);
});
答案 1 :(得分:2)
谢谢大家,但是我设法解决了这个问题,我的错误是:
this.cacheService.getMainCache()
.pipe(switchMap((val) => from(val.list)))
.pipe(filter((item: any) => item.name == 'profile'))
.subscribe((val) => {
console.log(val);
}, (error) => {
console.log('Error: ', error);
});
答案 2 :(得分:1)
尝试此@devnosaur,它可能会解决您的问题。有关可观察过滤器的更多信息,请查看here
this.cacheService.getMainCache().map((value: any)=> value.filter(val=> val.name === 'profille')).subscribe((val) => {
console.log(val);
}, (error) => {
console.log('Error: ', error);
});
答案 3 :(得分:0)
@devnosaur,您在链管上进行的最新更新,实际上不需要链管。您进行的最有效的更改是switchMap(val => from(val.list)
,其作用与
map(val => val.list),
concatAll()
A。Winnen在上面推荐的。在我看来,即使这是多余的一行,但执行地图操作然后concatAll()可以更好地进行通信,而在创建的可观察对象(来源)上使用展平运算符(switchMap)似乎很麻烦。