2016-05-09 36 views
4

發送的對象中對屬性的值進行求和s我從http調用返回一個Student數組的觀察值。學生對象有一個名爲年齡屬性,Angular2 - 在我的<strong>service.component.j</strong> s中從可觀察的

student.ts

export class Student { 
    id: number; 
    name: string; 
    age:number; 
} 

service.componnet.js

getStudents(): Observable< Student[]> 

studentManagement.component.ts這是一個觀察者可觀察以上,我想總結學生的年齡。我知道我可以在源文件中添加一個sum()(這不太受歡迎,因爲我還需要在頁面中顯示學生的其他信息,例如id,name,個人年齡等),或者從_studentList中計算出來。除了這兩個,還有其他的方法嗎?

private _studentList:Student[]=[]; 

    .subscribe(
      returnedStudents => { 
       console.log(returnedStudents); 
       this._studentList = returnedStudents; 
      }, 
      erroMsg => this._errorMessage = erroMsg 
     ) 
+0

請問您可以添加更多的代碼。我看不到你想要總結的內容以及你想得到的結果。 –

+0

更新了謝謝。 – Hammer

回答

6

您可以使用Observable上的map來返回總和。

getStudents().map(arr => arr.reduce((a, b) => a + b.age, 0)); 

在這裏,我們減少內部陣列的學生的年齡屬性的總和。現在我們有一個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)); 
} 

我們要在這裏呼籲份額,因此可觀察到的變熱,並沒有做HTTP請求的兩倍。

+0

是否有解決方案調用getStudents()一次來顯示所有學生,並總結年齡? – Hammer

+0

當然,只需將上面的代碼包裝在不同的函數中,並在原始的Observable上調用'share()'。 :) –

+0

Tks。這看起來不錯,只有一個http請求。 – Hammer

1

您可以使用返回學生列表和年齡總和的map函數。類似的東西:

studentsObservable.map((students) => { 
    return { 
    ages: this.getAge(students), 
    students: students 
    }; 
});