我正在尝试在angular + ngrx app中使用此过滤器:
fetchById(id: number): Document {
return this.store.select( s => s.documents ).filter( obj => obj.id == id )[0]
}
documents
是Documents
的数组,后者具有id
属性。想法是过滤数组以选择一个文档。但是,我收到此错误消息:
id
类型中不存在Document[]
属性。我不理解该消息,因为obj
是数组的元素,因此某个对象具有id属性。关于这里有什么问题的任何想法?谢谢!
答案 0 :(得分:1)
让我们分解行动,了解正在发生的事情......
fetchById(id: number): Observable<Document> {
const documents: Observable<Document[]> = this.store.select(s => s.documents);
const filtered: Observable<Document[]> = documents.filter((obj: Document[]) => obj.id == id );
const result: Observable<Document> = filtered.first();
return result;
}
请注意,Observable#filter()
的回调需要一个数组,而不是单个项目。这与Array#filter()
和错误消息的原因不同。另外,请注意我无法使用[0]
从观察中检索第一个项目,而是使用first()
。然后我更改了返回类型以返回一个observable。
然而,它并没有奏效。当我们考虑从可观察对象中过滤数组时,我们可能希望使用Observable#map()
来生成具有单个元素的另一个数组。
fetchById(id: number): Observable<Document> {
return this.store
.select(s => s.documents)
.map(list => obj.find(obj => obj.id === id));
.first();
}
如果我们想要返回observable的最后一个值,我们可以这样做:
fetchById(id: number): Document | null {
let result: Document | null = null;
this.store
.select(s => s.documents)
.map(list => obj.find(obj => obj.id === id) || null);
.first()
.subscribe(item => result = item);
return result;
}
我使用| null
键入了它,因为具有指定id
的文档可能不存在。