我正在尝试使用与distinct()
成一定角度的rxjs获得不同的存储区值(客户端)。我得到的结果和以前一样。
{ id: '2224', city: 'chicago', name: 'jon' },
{ id: '33', city: 'chicago', name: 'bill' },
{ id '223' city: 'chicago', name: 'jon' }
这是我的代码:
query = this.afs.collection('users', ref => ref.where('city' '==', 'chicago'))
.valueChanges({ idField: 'id' })
.pipe(
distinct((a: any) => a.name)
);
我得到所有结果,好像pipe不存在一样。
从official doc开始,我希望得到这个:
{ id: '2224', city: 'chicago', name: 'jon' },
{ id: '33', city: 'chicago', name: 'bill' }
我应该手动使用switchMap还是其他方法来过滤结果?
我相信,使用distinct()
并不是适合您的用例的工具。您将得到一个完整的阵列作为响应,distinct
将对单个排放起作用。
您可以将阵列转换为单独的发射,然后可以看到distict()
正常工作。
this.afs.collection('users', ref => ref.where('city' '==', 'chicago'))
.valueChanges({ idField: 'id' })
.pipe(
mergeMap((allDocs) => {
return from(allDocs).pipe(distinct((eachDoc) => {
return eachDoc.name;
}))
})
).subscribe((data) => {
console.log(data);
});
这里您不会得到第二个“帐单”,但是,我认为您不需要这种响应,在这里您将获得单个对象而不是数组。这意味着,您的订阅回调将被调用相同的次数,内部的observable会发出。
解决方案:您可以自己过滤掉存储库,像这样的东西可能是一个很好的解决方案:
this.afs.collection('users', ref => ref.where('city' '==', 'chicago'))
.valueChanges({ idField: 'id' })
.pipe(
map((allDocs) => {
const auxObj = allDocs.reduce((acc, eachDoc) => {
acc[eachDoc.name] = eachDoc;
return acc;
}, {});
return Object.values(auxObj);
})
).subscribe((data) => {
console.log('filtered data', data);
})