Angular2 - 对可观察对象发送的Object中的属性值求和

Ham*_*mer 4 javascript rxjs typescript rxjs5 angular

在我的service.component.j中,我从http调用返回一个Student数组的observable.Student对象有一个名为age的属性,

student.ts

export class Student {
  id: number;
  name: string;
  age:number;
}
Run Code Online (Sandbox Code Playgroud)

service.componnet.js

getStudents (): Observable< Student[]> 
Run Code Online (Sandbox Code Playgroud)

在作为上述观察者的观察者的studentManagement.component.ts中,我想总结学生的年龄.我知道我可以将sum()放在源代码中(这是不太优选的,因为我还需要在页面中显示学生的其他信息,例如id,name,个别年龄.)或者从_studentList计算它.除了这两个,还有其他方式吗?

private _studentList:Student[]=[];

    .subscribe(
            returnedStudents => {
              console.log(returnedStudents);
              this._studentList = returnedStudents;
            },
            erroMsg => this._errorMessage = erroMsg
          ) 
Run Code Online (Sandbox Code Playgroud)

Luk*_*itz 6

你可以map在Observable上使用它来返回总和.

getStudents().map(arr => arr.reduce((a, b) => a + b.age, 0));
Run Code Online (Sandbox Code Playgroud)

在这里,我们将内部数组减少为学生年龄属性的总和.现在我们拥有的是一个Observable<number>,它将排出年龄的总和.

如果要同时显示:

getStudents (): Observable< Student[]> {
   return this.http.get(/*...*/).share();
}

getAgeSum(): Observable<number> {
    return this.studentsObservable
       .map(arr => arr.reduce((a, b) => a + b.age, 0));
}
Run Code Online (Sandbox Code Playgroud)

我们必须在这里调用share,以便Observable变得很热,并且不会两次执行HTTP请求.