【问题标题】:Array Loop with FirebaseObservable带有 FirebaseObservable 的数组循环
【发布时间】:2017-07-16 12:58:59
【问题描述】:

我正在开发以下组件:

import {BudgetItem} from "../models/budget.model";
import {Injectable} from "@angular/core";
import {FirebaseListObservable, AngularFire, FirebaseObjectObservable} from "angularfire2";

@Injectable()
export class BudgetService{

  public ausgaben:number;
  public einnahmen:number;
  public budgetArray = [];

  private budget:FirebaseListObservable<any>;
  private budgetItemToUpdate;

  constructor(private af:AngularFire){
    this.budget = af.database.list('/Budget');
    this.ausgaben = this.getAusgaben();
    this.einnahmen = this.getEinnahmen();

    this.budget.subscribe(items => {
      // items is an array
      items.forEach(item => {
          this.budgetArray.push(new BudgetItem(item.zweck,item.betrag,item.ausgabe));
      });
    });
  }

  //Nimmt ein BugetItem als Parameter und fügt dieses der Datenbank als neuen Datensatz bei
  addToBuget(item:BudgetItem){
    this.budget.push({zweck:item.zweck,betrag:item.betrag,ausgabe:item.ausgabe});
  }

  //Nimmt den Key eines Objekts und löscht das jewelige Objekt aus der Datenbank
  removeFromInventar(key:string){
    this.budget.remove(key);
  }

  //Synchronisiert ein bestehendes Objekt mit der Datenbank
  updateBudgetItem(item){
    this.budgetItemToUpdate = this.af.database.object("Budget/" + item.$key)
    this.budgetItemToUpdate.update({zweck:item.zweck,betrag:item.betrag,ausgabe:item.ausgabe});
  }

  //berechnet die totalen Einnahmen. Als Anfangswert wird 2500(Budget) gesetzt.
  getEinnahmen(){

    this.einnahmen = 2500;

    console.log(this.budgetArray);

    for(let item of this.budgetArray){
      if(item.ausgabe === "Einnahme"){
        this.einnahmen = this.einnahmen + item.betrag;
      }
    }
    console.log(this.einnahmen);
    return this.einnahmen;
  }




  //berechnet die totalen Ausgaben. Als Anfangswert wird 0 gesetzt.
  getAusgaben(){

    this.ausgaben = 0;

    console.log(this.budgetArray);

    for(let item of (this.budgetArray)){
      if(item.ausgabe === "Ausgabe"){
        this.ausgaben = this.ausgaben + item.betrag;
      }
    }

    console.log("Ausgaben: " + this.ausgaben)
    return this.ausgaben;
  }

}

我可以建议将我的项目推送到数组中,但我想将个别对象的项目属性“Betrag”相加并显示它们的总和。

我的错误在哪里,或者您有什么建议可以让代码正常工作?

【问题讨论】:

  • 我不确定我是否理解您的问题。 从概念上讲您有一个带有betrag 属性的对象的异步列表,并且您想将所有betrag 属性相加?
  • 没错,但是我对加法部分的实现有问题。

标签: arrays angular typescript firebase firebase-realtime-database


【解决方案1】:

这里是它的要点:

af.database.list('/Budget')
  // Reduce all the items to a single value.
  .map(items => items.reduce((acc, item) => acc + item.betrag, 0))
  // Log the total
  .do(total => console.log(total));

希望您可以根据自己的情况调整此代码。如果您需要帮助,请告诉我。

【讨论】:

    【解决方案2】:
        getEinnahmen(){
    
        this.einnahmen = 0
    
       this.af.database.list("/Budget",{query:{
         orderByChild:'ausgabe',
         equalTo:'Einnahme'
       }}).map(items => items.reduce((acc, item) => acc + item.betrag, 0))
       // Log the total
         .subscribe(total => {console.log(total);this.einnahmen = total;});
    
       return this.einnahmen+2500;
    
      }
    

    我使用 reduce 方法更改了代码。现在我可以将总数记录到控制台,但现在我想将其添加为 getEinnahmen 方法的返回值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-22
      • 2011-03-03
      相关资源
      最近更新 更多