Localstorage: изменить значение для определенного массива с помощью Stringify

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

Вот как выглядит мое локальное хранилище:

[{"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, ссылка asos.com. Как я могу изменить это на stackoverflow.com ?

Я предполагаю, что это будет что-то вроде этого:

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

ИЗМЕНИТЬ:

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

Спасибо


person jQuerybeast    schedule 12.11.2011    source источник


Ответы (2)


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

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

NB: в этом примере я использую 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(key, item);

person roselan    schedule 12.11.2011
comment
Спасибо за ваш ответ. Ваш пример заставляет меня изменить все мое веб-приложение, чего я не могу сделать. Я уже получаю данные, но это обновление того, чего я не добился. Вот моя рабочая скрипка: jsfiddle.net/kZN4y. Используя ту же кодировку, я хочу обновить значение, указанное в клике по обновлению. Это возможно? - person jQuerybeast; 12.11.2011
comment
хммм, проверьте свою обновленную скрипту, я создал функцию set href. (и обратный вызов фильтра, для пинков ^^). и демонстрационная обработка (не повторное хранение json в конце, чтобы сохранить обновленный href) - person roselan; 12.11.2011
comment
и этот для более стандартного подхода. (и, пожалуйста, примите, если это ответит на ваш вопрос ^^) - person roselan; 12.11.2011
comment
Как я могу удалить значение, используя тот же метод, что и этот: jsfiddle.net/kZN4y/7 ? - person jQuerybeast; 14.11.2011
comment
конечно: вот оно. Я также немного изменил функцию set (не нужно возвращать объект) - person roselan; 15.11.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.

person Geuis    schedule 12.11.2011
comment
Спасибо. Я уже получаю значения из локального хранилища, и, похоже, вы используете другой способ сделать это, и я не могу изменить всю схему моего веб-приложения. Вот как я получаю данные: jsfiddle.net/kZN4y. Используя тот же код, я хочу обновить значение, указанное в клике по обновлению. - person jQuerybeast; 12.11.2011