【问题标题】:Localstorage: Change value for a specific array using StringifyLocalstorage:使用 Stringify 更改特定数组的值
【发布时间】:2011-12-27 14:50:19
【问题描述】:

我不知道这个问题是否非常准确,但我正在尝试从本地存储数组中更改一个值。

这是我的本地存储的样子:

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

关键是“结果”。

我怎样才能setItemid:item-6, href:。举个例子。第 6 项,href 是asos.com。如何将其更改为 stackoverflow.com

我认为它会是这样的:

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

编辑:

我已经实现了从本地存储中检索数据: 这是工作小提琴:http://jsfiddle.net/kZN4y/。使用相同的编码,我想更新更新点击中提到的值。这可能吗?

谢谢

【问题讨论】:

    标签: javascript jquery json local-storage stringify


    【解决方案1】:

    就个人而言,我会毫不犹豫地创建处理完整对象的函数,在您的情况下类似于:

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

    check this 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(key, item);

    【讨论】:

    • 感谢您的回答。你的例子让我改变了我做不到的整个网络应用程序。我确实已经检索了数据,但它是对我尚未实现的内容的更新。这是我的工作小提琴:jsfiddle.net/kZN4y。使用相同的编码,我想更新更新点击中提到的值。这可能吗?
    • hmmm,check your updated fiddle,我确实创建了一个 set href 函数。 (还有一个过滤器回调,用于踢球^^)。以及处理它的演示(不是最后“json”的“重新存储”,以保存更新的href)
    • and this one 以获得更“标准”的方法。 (如果它回答了您的问题,请接受^^)
    • 如何使用与此相同的方法删除一个值:jsfiddle.net/kZN4y/7
    • 确定:here it is。我也确实改变了 set 函数(不需要返回对象)
    【解决方案2】:

    您的问题并不完全清楚,但希望这会有所帮助。

    由于 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对象值更新。

    【讨论】:

    • 谢谢。我已经从本地存储中检索了值,看来您正在使用不同的方式来做这件事,我无法真正改变我的网络应用程序的整个架构。这就是我检索数据的方式:jsfiddle.net/kZN4y。使用相同的代码,我想更新更新点击中提到的值。
    猜你喜欢
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 2020-10-29
    • 2016-05-26
    • 2022-01-12
    • 2021-10-20
    • 1970-01-01
    相关资源
    最近更新 更多