個人的には、オブジェクト全体を処理する関数を作成することを躊躇しません。あなたの場合は次のようになります。
var blob = [{"id":"item-1","href":"google.com","icon":"google.com"},
{"id":"item-2","href":"youtube.com","icon":"youtube.com"},
{"id":"item-3","href":"google.com","icon":"google.com"},
{"id":"item-4","href":"google.com","icon":"google.com"},
{"id":"item-5","href":"youtube.com","icon":"youtube.com"},
{"id":"item-6","href":"asos.com","icon":"asos.com"},
{"id":"item-7","href":"google.com","icon":"google.com"},
{"id":"item-8","href":"mcdonalds.com","icon":"mcdonalds.com"}];
// define helper functions
Storage.prototype.setBlob = function (blob)
{
for (i in blob) {
// example of storageObjet: {'item-3': {'href': 'google.com', 'icon': 'google.png'}}
var struct={};
for (key in blob[i]) {
if (key != 'id') {
struct[key] = blob[i][key];
}
};
this.setObject(blob[i].id, struct);
}
}
Storage.prototype.setObject = function(key, obj) {
this.setItem( key, JSON.stringify(obj) );
};
Storage.prototype.getObject = function(key) {
return JSON.parse(this.getItem(key));
};
// do stuff
sessionStorage.clear();
sessionStorage.setBlob(blob);
var key = 'item-6';
var item = sessionStorage.getObject(key);
item.href = 'stackoverflow.com';
sessionStorage.setObject(key, item);
for (key in sessionStorage) {
if (typeof(sessionStorage[key]) == 'string') {
var item2 = sessionStorage.getObject(key);
$('#stuff').append( $('<div>').html(item2.href) );
}
}
このjsfiddleをチェックしてください
注意: この例では、localStorage の代わりに sessionStorage を使用していますが、インターフェイスは同じで、どちらも Storage プロトタイプを使用しています。
ご覧のとおり、各アイテムの構造を {'item-3': {'href': 'google.com', 'icon': 'google.png'}} のように変更します。私がこれを行うのは、javascript、localStorage、および全体的なキー/値の概念をより適切に反映し、使用を大幅に容易にするためです。
この例では、次のものがあります。
var item = sessionStorage.getObject(key);
item.href = 'stackoverflow.com';
sessionStorage.setObject(key, item);
これは、localStorage を処理するための非常に実用的な方法に見えます。
さらに、「setBlob」関数は、アイテムごとにランダムで可変数の要素を処理できます。これにより、必要に応じて 5 つの属性を持つ 1 つのアイテムを持つことができますが、他のすべてのアイテムには 2 つの属性があります。キー「id」で呼び出される 1 つの要素がある限り、「フラット」構造で機能します。
編集: デバッグし、より古典的な setValue(key, item); に切り替えました。