2016-04-04 9 views
0

にオブジェクトの値を設定し、私は次のような形式でのlocalStorageにオブジェクトを設定しようとしている:取得とのlocalStorage配列

私は 1または 2ベースを設定することができるだろう

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

私がREST呼び出しから得ている動的な値に基づいています。私はこのフォーマットを使用してのlocalStorageにデータを取得することができ

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

しかしStorageObject[thisItemsListID]は常にif文に入ったとのlocalStorageで重複アイテムを生成し、私はこれにアクセスするかどうかはわかりません。私はこれまで持っていることです変数。私はそれが存在しない場合、新しいIDを追加しようとしているので{1:{}が存在しますが、現在のIDは2です。新しい値をプッシュする必要があります。

私はここに閉じ込めていますが、フォーマットを再評価する必要があります。私はデータ文字列を保存していますが、ここでは円になり、正しい方向にポイントを使用できます。

答えて

1

まあ、重複した項目はStorageObject.push(itemProperties)で起きています。

オブジェクトを更新するために、これを試してみてください:

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

[EDIT]あなたは[{"1":{"property1":false,"property2":false}},{"2":{"property1":false,"property2":false}}]を維持したい場合は

。条件付きには少し違うでしょう。

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

右 - 私のポストからはっきりしていなかったと思います。一度に1つのアイテムしか見ていないので、IDが存在しない場合は新しいアイテムを追加する必要があります。だから私は既に '{1:{}'を持っていて、現在のIDが '{2:{}'であれば、新しい値をプッシュしようとしていた文字列にそれを追加する必要があります。 – Aaron

+0

オーン、そうです。まあ、あなたは間違った方法でリストを使用しています。 'this {{" 1} "{property1":false、 "property2":false}}、{"2":{"property1":false、 "property2":false}}] '、' thisItemsListID 'は' 2 'です。 '!StorageObject [thisItemsListID]'はfalseになります。配列 'StorageObject'の' 2'インデックスが 'null'であるためです。 – Filipe

+1

@Aaron私は、配列内のオブジェクトキーを評価する条件付きの答えを更新しました。 – Filipe

0

オブジェクトを更新しようとしていますか、上書きしていませんか? Filipesレスポンスは、オブジェクトを新しい値で再割り当てするだけでストレージオブジェクト全体を更新する方法を示しています。

オブジェクトのセクション/値として更新する場合は、forループを使用してオブジェクトを更新できます。これにより、配列をスキャンして1つのプロパティを見つけ出し、削除したり、更新したり、上書きしたりすることができます。

ループの例です。このことは、私が構築していたレポートライブラリのスニペットです。これは、角$スコープを使用していますが、それはあなたが別のフレームワークを使用している場合、それは本当にいくつかを持ってlowDashよう

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

(ここでは、私が好きな/ブックマークとしてラベルを設定しています)、あなたの更新に似た行動をしている複合型であります配列の更新と評価のための素敵なヘルパー関数。

関連する問題