Localstorage: изменить значение для определенного массива, используя Stringify - PullRequest
3 голосов
/ 12 ноября 2011

Я не знаю, является ли вопрос очень точным, но я пытаюсь изменить значение из массива localalstorage.

Вот как выглядит мое localalstorage:

[{"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"}]

Ключ «результат».

Как я могу setItem для id:item-6, href:.Так например.Пункт-6, href: asos.com.Как я могу изменить это значение на stackoverflow.com?

Я предполагаю, что это будет примерно так:

localStorage.setItem("result", JSON.stringify( ??? ));

РЕДАКТИРОВАТЬ:

Iуже достигнуто извлечение данных из локального хранилища: Вот рабочая скрипка: http://jsfiddle.net/kZN4y/. Используя ту же кодировку, я хочу обновить значение, упомянутое в щелчке обновления.Это возможно?

Спасибо

Ответы [ 2 ]

3 голосов
/ 12 ноября 2011

Лично я без колебаний создаю функции, которые обрабатывают весь объект, в вашем случае что-то вроде:

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

Примечание: в этом примере я использую sessionStorage вместо localStorage, но интерфейс один и тот же, оба используют прототип 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 атрибутов, если хотите, в то время как все остальные имеют 2. Он работает с вашей «плоской» структурой, если существует один элемент, вызываемый с помощью ключа «id».

РЕДАКТИРОВАТЬ: отладка и переключение на более классический setValue (ключ, элемент);

0 голосов
/ 12 ноября 2011

Ваш вопрос не совсем понятен, но, надеюсь, это поможет.

Поскольку localStorage является хранилищем ключей / значений, каждый ключ должен иметь уникальное значение. Если вы хотите сохранить объект json для определенного ключа, он должен быть преобразован в строку для сохранения и проанализирован для его получения.

Обычно я пишу пару служебных функций для получения / установки значений.

var get = function(key){
    return JSON.parse(localStorage.getItem(key));
}

var set = function(key, val){
    localStorage.setItem( JSON.stringify(val) );
}

Затем в вашем коде вы обновите объект, возвращенный из get (), а затем передадите этот объект в set (), который вернет его в localStorage.

Обновление значений в возвращаемом объекте является стандартным обновлением значений в объекте js.

...