【问题标题】:Objects are not pushing into Local Storage Array [duplicate]对象未推入本地存储阵列 [重复]
【发布时间】:2021-06-06 03:00:22
【问题描述】:

帮帮我!我将一组对象设置到本地存储中。我遇到的问题是,每当我推送新对象时,它都会删除最后一个对象并存储新对象并使用新对象存储数组更新。并只保留单个对象。但我想在数组中设置多个对象。我找不到我做错了什么。

    let recent_searched = [];
    let searched_item = {}
    
    const storeLocal = (e) => {
            searched_item['artwork'] = "image.jpg"
            searched_item['itemName'] = "Harry Potter"
            searched_item['itemWriterName'] = "J K Rowling"

            recent_searched.push(searched_item)

            localStorage.setItem("recent_searched", JSON.stringify(recent_searched));
     }
    console.log(JSON.parse(localStorage.getItem("recent_searched")))

【问题讨论】:

  • recent_searched 分配给JSON.parse(localStorage.getItem("recent_searched")) 而不是[]

标签: javascript ecmascript-6 local-storage


【解决方案1】:

您的代码只创建 一个 普通对象。它是用let searched_item = {} 定义的。您的其余代码仅改变该单个对象,即使它已经存在于数组中。因此,您只需将重复的对象引用附加到您的数组。

每次将其推送到数组时,您都需要创建一个单独的对象。所以:

let recent_searched = [];

const storeLocal = (e) => {
    let searched_item = {   // This creates(!) an object
        artwork: "image.jpg",
        itemName: "Harry Potter",
        itemWriterName: "J K Rowling"
    };
    recent_searched.push(searched_item)

    localStorage.setItem("recent_searched", JSON.stringify(recent_searched));
}

如果您的页面重新加载,请注意您的数组变量不是从头开始维护和创建的。因此,请确保在页面加载时,读取本地存储中的内容:

let stored = localStorage.getItem("recent_searched");
let recent_searched = stored ? JSON.parse(stored) : []; 

【讨论】:

  • 创建一个新对象,或将属性分配给现有对象,这仍然不会将其从本地存储附加到现有数组。
  • 它将它附加到数组 recent_searched,然后将该(扩展)数组作为 JSON 写入本地存储,我相信这正是 OP 想要的。
  • it removes the last object and stores the new one and array updates with new one. and keeps just single object. but I want to set multiple objects in array. 听起来他们希望recent_searched 包含本地存储中的最新值。
  • @AustinBrunkhorst 我希望所有对象都继续添加。数组应该像我们将对象推入其中一样更新。
  • 如果在页面重新加载后如何从存储中读取数组存在混淆,我添加了一段关于此的内容。
【解决方案2】:

localStorage.setItem 就像一个替换函数,它会尝试添加一个为提供的键传递的值,如果该键已经存在于本地存储中,那么它将用新值替换旧值。

您需要在保存之前获取旧值并将新值附加到它。

类似的东西

    let recent_searched = [];
    let searched_item = {};
    const data = await localStorage.getItem("recent_searched");
    if(data){
         recent_searched = JSON.parse(data);
    }
    searched_item['artwork'] = "image.jpg"
    searched_item['itemName'] = "Harry Potter"
    searched_item['itemWriterName'] = "J K Rowling"
    
    recent_searched.push(searched_item)
    
    localStorage.setItem("recent_searched", JSON.stringify(recent_searched));

【讨论】:

  • 返回 null 不知道为什么。
  • 我已经更新了代码 sn-p,检查它是否适合你
  • 它给出了一个错误。 Invalid attempt to spread non-iterable instance. In order to be iterable, non-array objects must have a [Symbol.iterator]() method.
  • 如果我删除吊具..然后它会回到 null
  • 我已经通过this question 完成了它。仍然感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2015-09-29
  • 2020-09-28
  • 2016-05-02
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 2021-09-12
相关资源
最近更新 更多