2016-04-04 5 views
0

Ich versuche Objekte in localstorage mit einem Format ähnlich dem folgenden zu setzen:Setzt und Objektwerte in localstorage Array

[{"1":{"property1":false,"property2":false}},{"2":{"property1":false,"property2":false}}]

Wo ich in der Lage wäre, die 1 oder 2 Basis einstellen auf einen dynamischen Wert bekomme ich von einem REST-Aufruf. Was ich bisher habe, ist:

// check if session exists and create if not 
var StorageObject = JSON.parse(localStorage.getItem("session")) || []; 

//see if the current id from the REST call is in storage and push with properties if not 
if ( !StorageObject[thisItemsListID]) { 
    var itemProperties = {}; 
    itemProperties[thisItemsListID] = {}; 
    itemProperties[thisItemsListID]["property1"] = false; 
    itemProperties[thisItemsListID]["property2"] = false; 

    StorageObject.push(itemProperties); 
    localStorage.setItem('session', JSON.stringify(StorageObject)); 
} 

Ich kann die Daten in localstorage in diesem Format erhalten, aber StorageObject[thisItemsListID] bekommt immer in die if-Anweisung und erzeugt ein doppeltes Element in localstorage und ich bin nicht sicher, wie dies für den Zugriff mit eine Variable. Ich versuche, die neue ID anzuhängen, wenn sie nicht existiert, also wenn {1:{} existiert aber aktuelle ID ist 2 Ich muss den neuen Wert schieben.

Ich bin hier in der Nähe und vielleicht muss ich das Format, das ich die Datenkette speichern, neu bewerten, aber ich gehe hier im Kreis und könnte einen Punkt in die richtige Richtung verwenden.

Antwort

1

Nun, das doppelte Element passiert in StorageObject.push(itemProperties).

diese versuchen, das Objekt zu aktualisieren:

//StorageObject.push(itemProperties); <-- remove 
StorageObject[thisItemsListID] = itemProperties; 

[EDIT]

Wenn Sie [{"1":{"property1":false,"property2":false}},{"2":{"property1":false,"property2":false}}] behalten möchten. Zu bedingt wäre das ein bisschen anders.

var haveItem = StorageObject.filter(function(item){ 
    return Objects.keys(item)[0] == thisItemsListID; 
}).length > 0; 


if ( !haveItem) { 
    var itemProperties = {}; 
    itemProperties[thisItemsListID] = {}; 
    itemProperties[thisItemsListID]["property1"] = false; 
    itemProperties[thisItemsListID]["property2"] = false; 

    StorageObject.push(itemProperties); 
    localStorage.setItem('session', JSON.stringify(StorageObject)); 
} 
+0

Richtig - ich denke, es war nicht klar aus meiner Post. Ich schaue nur ein Element nach dem anderen an und muss das neue Element anhängen, wenn die ID nicht existiert. Also, wenn ich '{1: {}' bereits habe und die aktuelle ID '{2: {}' ist, muss ich es zu der Zeichenfolge hinzufügen, weshalb ich versuchte, einen neuen Wert zu pushen. – Aaron

+0

Oohn, ich verstehe. Nun, Sie verwenden Listen falsch. Betrachtet man das Objekt '{{" 1 ": {" property1 ": false," property2 ": false}}, {" 2 ": {" property1 ": false," property2 ": false}}]', wenn 'thisItemsListID 'ist' 2'. '! StorageObject [thisItemsListID]' wäre falsch. Weil der '2'-Index des Arrays' StorageObject' 'null' ist. – Filipe

+1

@Aaron Ich habe die Antwort aktualisiert, die bedingte Auswertung des Objektschlüssels innerhalb des Arrays. – Filipe

0

Versuchen Sie das Objekt zu aktualisieren oder überschreiben Sie es einfach? Die Filterantwort zeigt, wie das gesamte Speicherobjekt aktualisiert wird, indem das Objekt einfach mit dem neuen Wert neu zugewiesen wird.

Wenn Sie nur als Abschnitt/Wert des Objekts aktualisieren möchten, können Sie dies mit einer for-Schleife tun. Dies würde es Ihnen ermöglichen, das Array zu durchsuchen, die eine Eigenschaft zu suchen und sie dann zu entfernen, zu aktualisieren, zu überschreiben usw.

Hier ist ein Beispiel für die Schleife. Denken Sie daran Dies ist ein Auszug aus einer Berichtsbibliothek, die ich gerade erstellt habe. Es nutzt Winkel Umfang $, aber es ist eine komplexe Art, die eine ähnliche Wirkung wie das Update zu tun (hier ich ein Etikett als Favorit/Lesezeichen setze)

function OnFavoriteComplete(response) { 
     var id = response.config.data.reportId; //dynamic values set by client 
     var isFavorite = response.config.data.isFavorite;//dynamic values set by client 

     var arrayCount = $scope.reportList.length; 
//loop my current collection and look for the property id of the label 
//then check to see if true or false/this was a toggle enable disable 
     if (isFavorite) { 
      for (var i = 0, iLen = arrayCount; i < iLen; i++) { 
       if ($scope.reportList[i].reportId == id) { 
        $scope.reportList[i].isFavorite = false; 
       } 
      } 
     } 
//if false update the property with the new value 
     else { 
      for (var i = 0, iLen = arrayCount; i < iLen; i++) { 
       if ($scope.reportList[i].reportId == id) { 
        $scope.reportList[i].isFavorite = true; 
       } 
      } 
     } 
    }; 

Wenn Sie einen anderen Rahmen wie lowDash verwenden hat es einige wirklich nette Hilfsfunktionen zum Aktualisieren und Auswerten von Arrays.