javascript - Angular2 - summera värdena av en egenskap i objektet skickat från en observerbar
I mina service.component.js returnerar jag ett observable av en array av Student från http-anropet. Student-objektet har en egenskap som heter age,
student.ts
export class Student {
id: number;
name: string;
age:number;
}
service.component.js
getStudents (): Observable< Student[]>
I studentManagement.component.ts som är en observatör till det ovanstående observable, vill jag summera studenternas ålder. Jag vet att jag kan lägga en sum() i källan (vilket är mindre föredraget, eftersom jag också behöver visa annan information om studenterna på sidan, såsom id, namn, individuell ålder också) eller beräkna det från _studentList. Förutom dessa två, finns det något annat sätt?
private _studentList:Student[]=[];
.subscribe(
returnedStudents => {
console.log(returnedStudents);
this._studentList = returnedStudents;
},
erroMsg => this._errorMessage = erroMsg
)
Svar #1
Du kan använda map på Observable för att returnera summan.
getStudents().map(arr => arr.reduce((a, b) => a + b.age, 0));
Här reducerar vi den inre arrayen till summan av åldersegenskapen hos studenterna. Nu har vi ett Observable<number>, som kommer att sända summan av åldrarna.
Om du vill visa båda:
getStudents (): Observable< Student[]> {
return this.http.get(/*...*/).share();
}
getAgeSum(): Observable<number> {
return this.studentsObservable
.map(arr => arr.reduce((a, b) => a + b.age, 0));
}
Vi måste anropa share här, så att Observable blir hot och inte gör HTTP-förfrågan två gånger.
Svar #2
Du kan använda en map-funktion som returnerar både studentlistan och ålderssummorna. Något i den stilen:
studentsObservable.map((students) => {
return {
ages: this.getAge(students),
students: students
};
});
