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
  };
});

Relaterade artiklar