2017-01-26 14 views
0

Ich habe diese Funktion bekommeÄndern verschachteltes Objekt und dann wieder das geänderte übergeordnete Objekt

function save(value, ...props) 
{ 
    var record; 
    var allRecords = JSON.parse(window.localStorage.getItem("data")); 
    record = allRecords; 
    for (var prop of props) 
    { 
     record = record[prop]; 
    } 
    record = value; 
    window.localStorage.setItem("data", JSON.stringify(allRecords)); 
} 

, deren Aufgabe ist es, eine Reihe von Daten in der window.localStorage zu speichern. Da es sich bei JavaScript jedoch um eine Sprache "Verweis nach Wert" handelt, wirkt sich das Ändern von record nicht auf das übergeordnete Objekt aus (allRecords). Also, wie kann ich durch das Speicherobjekt iterieren, eines der untergeordneten Elemente ändern und dann das geänderte übergeordnete Objekt speichern?

+0

Beachten Sie, dass Sie ein Objektiv beschreiben. Außerdem hast du den attraktivsten Benutzernamen, den ich je * gesehen * habe. https://medium.com/javascript-inside/an-introduction-into- lenses-in-japascript-e494948d1ea5#.20hn1a91i –

Antwort

1

Sie müssen das übergeordnete Objekt ändern:

function save(value, ...props) 
{ 
    var record = allRecords = JSON.parse(window.localStorage.getItem("data")); 
    var parent=record; 
    for (var prop of props) 
    { 
     parent=record;//store before modifying, so keep the parent 
     record = record[prop]; 
    } 

parent[prop]= value; 
window.localStorage.setItem("data", JSON.stringify((allRecords)); 
return parent; 
} 

auch immer Sie jetzt, dass Ihre Funktion geht „tief“ in das Objekt (nur sagen):

save("hi","a","b","c");//will save like this 
a={ 
    b={ 
    c="hi"; 
    } 
} 

Eine weitere Möglichkeit der stoppen würde, Schleife direkt vor der letzten Iteration, notieren Sie dann [prop] = value.

1.Wie Objekte gespeichert werden: Objekte werden mit Zeiger gespeichert. So im Speicher sieht es aus wie diese (Pseudocode):

//a memory location holding an object 
432: 
val1:1 
val2:2 

Wenn Sie den Namen des Objekts sagen ist a, a wie folgt gespeichert wird:

a = location:432 

, wenn Sie es kopieren, zum Beispiel mit b = a, nur der Zeiger kopiert wird nicht das Objekt:

a = location:432 
b = location:432 

Wenn Sie sth in das Objekt ein ändern, wird es in der Tat am Ort des Objekts ändern 432, also b wird geändert. Objekte in Objekte gleich aussehen:

//another obj 
100: 
    obj1: location:432 //our pointer to the object 

Also unsere for-Schleife (können am oberen speichern Beispiel bleiben) werden Zeiger auf ein Objekt folgen, erhalten eine Eigenschaft einen Zeiger zu halten, als auf ein anderes Objekt diesen Zeiger folgen (a-> b-> c). Diese Objekte sind irgendwo im Mem gespeichert. Die JSON.stringify-Funktion führt das tiefe Kopieren durch. Es folgt also jedem Zeiger und fügt alle notwendigen Informationen in eine Zeichenkette ein (Objekt a b und c).

  1. "Warum funktioniert der Code Arbeit und mys nicht wahr?":

Was Sie

value=obj[key]; 
value="new"; 

tun, was ich tun:

obj[key]="new"; 

Aber das ist das gleiche nicht wahr? NEE. Schauen wir uns die Daten im Speicher an:

//you 
//before 
value:undefined 
obj: 
    key:"old" 

//copying 
value:"old" 
obj: 
    key:"old" 

//changing 

value:"new" 
obj: 
     key:"old" //never changed... 
+0

Sie legen Daten zu allRecords fest, aber Sie haben es nicht deklariert. Was hast du vor, dort zu machen? –

+0

rechts. Ich habe den oberen Code gekürzt, ohne auf den darunterliegenden ... –

+0

Oh mein Gott. Wie kann es funktionieren ??? Es ist über mein Verständnis. Du ... kopierst das Hauptobjekt, dann gehst du tiefer hinein ... modifiziere ...und plötzlich wird auch das Master-Objekt modifiziert. Was ist hier unter der Haube? Warum funktioniert Ihr Snippet und meines nicht? –

Verwandte Themen