从rxJS observable中获取数组中的单个成员

时间:2016-06-05 00:04:40

标签: typescript angular rxjs

如果我有这样的数组类:

export class DashboardComponent {
    people$: Observable<Person[]>;
    selectedPerson$: Observable<Person>;
    constructor(selectedPersonId){
         this.people$ = getSomeObservableArrayOfPeople();//gets the array in an observable from some source

         // How to then selected the selected person from the array this.people???
    }
}

如何选择Observable<Person[]>然后选择一个Observable(或者只是原始值,无论哪个是正确的事情)。

2 个答案:

答案 0 :(得分:2)

你的问题有点不清楚,因此有点通用的答案:

当你订阅一个发出数组的observable时,无论你是否从一个observable获取该数组(至少在你实际得到它之后),没有什么不同。

让第一个人订阅observable并只访问数组的第一个元素,如

getSomeObservableArrayOfPeople().subscribe(data => this.person = data[0]);

如果观察者没有发出一系列人,而是发出一系列人的事件,那么你可以使用像

这样的运算符
getSomeObservableOfPeople().skip(3).take(1).subscribe(data => this.person = person);

这只需要第4个人而忽略所有其他人。

提示:需要明确导入skiptake等运营商才能使用。

对于发出上述示例中假设的人事件序列的可观察对象,可以使用scan运算符将此序列收集到数组中:

getSomeObservableOfPeople().scan(3).subscribe(data => {
  if(data.length >= 3) {
    this.person = data[2];
  }
})

每次发出新人时,都会使用数组调用传递给subscribe的回调,其中先前事件发出的人员与最后一个事件发出的人员合并。

答案 1 :(得分:1)

离开后回来我认为我的困惑部分不是理解观察者实际上是什么以及它是如何起作用的。

我想要做的是在一个observable中的数组的值,以便我可以得到另一个具有所选人的值的可观察对象。完整的(半sudo代码)如下:

import * as _ from 'lodash';

export class DashboardComponent {
    people$: Observable<Person[]>;
    selectedPerson$: Observable<Person>;
    constructor(selectedPersonId){
        this.people$ = getSomeObservableArrayOfPeople();//gets the array in an observable from some source
        this.selectedPerson$ = this.people$.map((people) => this.getSelectedPerson(selectedPersonId, people));

    }    
    getSelectedPerson(selectedPersonId, people){
        if(!(state || people.length == 0)) return null;    
        return _.find(people, function(r: Person) { return r.id === selectedPersonId; });
    }
}