过滤器数组为angular2 + ngrx

时间:2016-12-03 08:42:44

标签: arrays angular filter redux

我正在尝试在angular + ngrx app中使用此过滤器:

fetchById(id: number): Document {

return this.store.select( s => s.documents ).filter( obj => obj.id == id )[0]

 }

documentsDocuments的数组,后者具有id属性。想法是过滤数组以选择一个文档。但是,我收到此错误消息:

id类型中不存在Document[]属性。我不理解该消息,因为obj是数组的元素,因此某个对象具有id属性。关于这里有什么问题的任何想法?谢谢!

1 个答案:

答案 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的文档可能不存在。