2017-03-07 4 views
0

ich ein Objekt wie das habe:Nested Berechnung mit Javascript & Angular (v1)

vm.data = { 
     a : { 
      v : 25 
     }, 
     b : { 
      v : "", 
      c : "f + a" 
     }, 
     c : { 
      v : "", 
      c : "b + a" 
     }, 
     d : { 
      v : "", 
      c : "c + e" 
     }, 
     e : { 
      v : "", 
      c : "a + c" 
     }, 
     f : { 
      v : "", 
      c : "b + c" 
     } 
    }; 

und ich möchte all diese Berechnungen jedes Mal, wenn ich A. getan haben wechsle ich keine Lösung finden lösen dieses Problem. Irgendeine Idee?

PS: Dies ist nur ein einfaches Beispiel für ein Objekt, das Hunderte von Malen größer und komplizierter ist.

+0

warum nicht eine Funktion oder Getter verwenden? –

+0

Haben Sie an einem Ort gespeichert, welche Änderung welche Berechnungen auslöst? Oder sind sie in Code oder etwas codiert? –

+0

@NinaScholz: Kannst du bitte ein Beispiel eines Getters geben? Gonzalo.-: Ich habe einen Service mit diesen Daten und ich muss all diese Werte jedes Mal berechnen, wenn ich einen von ihnen ändere (in diesem Fall nur A). – Ale

Antwort

2

Sie könnten einen getter method verwenden, um einen tatsächlichen Wert der Berechnung der Eigenschaften zu erhalten.

var object = { 
 
     a: 6, 
 
     b: 42, 
 
     get c() { 
 
      return this.a + this.b; 
 
     } 
 
    }; 
 
    
 
console.log(object.c); 
 
object.a = 1000; 
 
console.log(object.c);

var object = { 
 
     a : 25, 
 
     get b() { return this.a * 5; }, 
 
     get c() { return this.b + this.a; }, 
 
     get d() { return this.c + this.a; } 
 
    }; 
 
    
 
console.log(object.d); 
 
object.a = 1000; 
 
console.log(object.d);

+0

es ist eine sehr gute Lösung und es funktioniert gut ... Ich muss nur einen Weg finden, mein Original-Objekt auf diese Weise zu ändern. Das größte Problem ist, dass ich parseInt verwenden muss, um Zahlen zu erhalten, sonst sieht es die Werte wie Strings. Danke. PS: Jeder andere Vorschlag ist sehr willkommen (ich möchte vermeiden, das ursprüngliche Objekt zu ändern)! – Ale

+0

PSS: Es funktioniert auf diese Weise: vm.data = { a: 25, get b() { return this.a * 5 }, get c() { return parseInt (this.b) + parseInt (this.a) }, get d() { Rückgabe parseInt (this.c) + parseInt (this.a) } }; aber es funktioniert nicht, wenn, in c, eine Änderung this.b mit this.d, weil d berechnet wird danach (ich nehme an) ... und ich habe solche Szenarien leider. – Ale

+0

Sie brauchen die richtige Reihenfolge und verhindern zirkuläre Referenzen. –