【问题标题】:How do I update my array with my object's value? [duplicate]如何使用对象的值更新数组? [复制]
【发布时间】:2019-01-15 13:59:25
【问题描述】:

myObj 存储来自用户的输入,该输入被推送到 arr,该输入作为“数据”键存储在 localStorage 中。在提交时,我希望将新值添加到 arr 而不是覆盖它(在 else 部分)。以下代码有效,但会覆盖旧数据:

var myObj = {
    field1: fname.value,
    field2: lname.value,
    field3: birth.value,
    field4: salary.value,
    field5: String(selectedGender),
    field6: String(choicesOfHobby),
    field7: color.value,
    field8: String(choicesCountry),
    field9: textArea.value
}  
    const arr = new Array()
if (window.localStorage.length == 0) {
   const arr = JSON.stringify(myObj); 
   window.localStorage.setItem('data', arr);
} else {
    const arr = JSON.stringify(myObj); 
   window.localStorage.setItem('data', arr);
}

【问题讨论】:

  • arr 不是数组,这里没有推送任何内容。如果你想要一个对象数组,你需要实际使用一个对象数组。
  • localStorage 实际上是一个键值存储,所以你不能有两个相同的键......并且执行 JSON.stringify 不会将对象转换为数组......
  • setData('data') 表示您将数据设置为 x,因此您自己覆盖数据。换句话说,您的 if/else 子句什么都不做,因为 if 和 else 都将同一个项目设置为 localStorage 中的同一个键。使用两个不同的名称?
  • 我知道并且我仍然想要相同的键,但我想更新它的值,所以它是旧的 + 新的 myObj 的字符串,这是输入
  • 我被指示使用相同的密钥

标签: javascript


【解决方案1】:

需要注意的一点是 JSON.stringify 返回一个字符串,而不是一个数组——而且,方便地,localStorage 存储键/值对,其中值是一个字符串,所以这一切都按预期工作。

要更新 localStorage 中的值,您可以先检索它,然后随意修改它,然后再次存储它。由于您使用的是 javascript 对象,因此您需要使用 JSON.parse 和 JSON.stringify 在对象(使用)和字符串(存储)之间来回转换。 这种模式看起来像:

let retrievedString = localStorage.getItem('data');
let retrievedObject = JSON.parse(retrievedString); // convert string to obj
let oldColor = retrievedObject.field7; // we don't actually use oldColor
let newColor = "#666666"; 
retrievedObject.field7 = newColor; //change existing property
retrievedObject.field99 = "99"; // add new property
let modifiedString = JSON.stringify(retrievedObject); // ready to store new version
localStorage.setItem('data', modifiedString);

我在代码示例中添加了更多内容,以阐明在转换回字符串并最终替换存储中的旧版本之前可以对检索到的对象执行哪些操作。

【讨论】:

  • 没错!但是现在我如何用我的对象替换“......这将......”,以便它正确存储在 localStorage 以便我以后可以访问它?
  • 请看我编辑的答案。这清楚吗? -- 我将添加另一个代码示例以澄清。
  • 我这样做了 let arr = new Array() arr = JSON.parse(window.localStorage.getItem("data")); arr.push(myObj); const arrPush = JSON.stringfy(arr) window.localStorage.setItem("data",arrPush);但它说 arr.push 不是函数
  • 原因是push()只适用于数组,而arr不是数组。 (Javascript 是动态类型的,因此即使您将其声明为数组,当您将 JSON.parse() 的结果分配给它时,它也会自动转换为 javascript 对象。)要向对象添加内容,请使用 let myNewValue = "whatever"; arr.myNewKey = myNewValue; (如果不清楚,请参阅developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/…。)
【解决方案2】:

你的错误:

  1. arr,尽管它的名字,不是一个数组。
  2. 您永远无法恢复保存的数据

检查下面的代码,看看我对这个问题的看法:(在尝试之前,你应该擦除你的 localStorage)

var myObj = {
    field1: fname.value,
    field2: lname.value,
    field3: birth.value,
    field4: salary.value,
    field5: String(selectedGender),
    field6: String(choicesOfHobby),
    field7: color.value,
    field8: String(choicesCountry),
    field9: textArea.value
}
const array = window.localStorage.data || []; // get your saved array, or create a new one
array.push(myObj); // Add the current item to the array  
window.localStorage.setItem('data', JSON.stringify(array)); // save it again

还有什么问题可以问

【讨论】:

    【解决方案3】:

    你需要使用这样的东西:

    let data = localStorage.getItem('data');
    let dataObj = JSON.parse(data);
    dataObj[fieldKey] = fieldObj;
    localStorage.setItem('data', JSON.stringify(dataObj));
    

    【讨论】:

      【解决方案4】:

      先阅读localstorage文档如何使用:https://developer.mozilla.org/tr/docs/Web/API/Window/localStorage 在从 localstorage 获取数据数组后,您必须将数据数组推送到 localstorage 并将您的对象推送到您的数据数组。最后不要忘记再次将您的数据数组设置为 localstorage。您的本地存储部分代码应如下所示:

          var data = JSON.parse(window.localStorage.getItem("data"));
          if(data === null){
           data = [];
          }
          data.push(myObj);
          window.localStorage.setItem("data",JSON.stringfy(data));
      

      【讨论】:

        【解决方案5】:

        你只需要使用这个:

        arrInStorage = localStorage.getItem('data') || [];
        arr = JSON.parse(arrInStorage);
        arr.push(myObj);
        localStorage.setItem('data', JSON.stringify(arr));
        

        而不是你的 if / else 语句。

        【讨论】:

        • 但 OP 在该代码中没有数组...
        • 我使用 if 因为对于第一次提交,没有 'data' 键
        • 但无论如何,我试图把它放在 else 中但没有任何反应,它甚至没有更新“数据”
        • 是的,这就是第一行修复的内容。如果未设置,则将 arr 设置为空数组,然后在存储之前添加第一个条目。
        • @MustafaAnas 与否决票相反,这个答案已经过测试并且正确。
        猜你喜欢
        • 2022-11-24
        • 2021-08-20
        • 2021-07-08
        • 2020-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多