【问题标题】:Append data to localStorage object将数据附加到 localStorage 对象
【发布时间】:2016-06-28 01:36:49
【问题描述】:

我正在尝试向当前的 localStorage 对象添加一个新对象,但未成功。最后,我没有在 localStorage 中有两组数据,而是得到最后一组。关于我做错了什么的任何见解?谢谢

这是我想要做的:

// add the first student
var newStudent = [{
     "name":        "John",
     "age":         21,
     "nationality": "Spanish"
 }];

localStorage.setItem("students", JSON.stringify(newStudent));


// Retrieve the object from storage to add a new student
var retrievedObject = localStorage.getItem("students");
var stored          = JSON.parse(retrievedObject);

// add a new student
var newStudent2 = [{
    "name":        "Mary",
    "age":         20,
    "nationality": "German"
}];
var stored = Object.assign(stored, newStudent2);

// Update the storage
localStorage.setItem("students", JSON.stringify(stored));
var result = localStorage.getItem("students");

console.log(result);

【问题讨论】:

  • 您是否尝试过类似的方法:window.localStorage.attr = value 或只是 localStorage.attr = value?
  • 您是否尝试在 localStorage 中拥有一组对象?您目前正在将每个对象放在它自己的数组中,这有点奇怪。
  • 是的,我正在尝试拥有一个对象数组,但只保存了最后一个。

标签: javascript jquery object local-storage


【解决方案1】:

你应该存储数组,而不是对象;

var students = [];

var student1 = { s: 1 };

students.push(student1);

localStorage.setItem("students", JSON.stringify(students));

var stored = JSON.parse(localStorage.getItem("students"));

var student2 = { s: 2 };

stored.push(student2);

localStorage.setItem("students", JSON.stringify(stored));

var result = JSON.parse(localStorage.getItem("students"));

console.log(result);

【讨论】:

  • 谢谢谢尔盖。这真的有效。现在我明白我做错了什么。
【解决方案2】:

在从 localStorage 取回存储的对象时,您正在用 newStudent2 替换存储的对象:

var newStudent = [{
     "name":        "John",
     "age":         21,
     "nationality": "Spanish"
 }];

localStorage.setItem("students", JSON.stringify(newStudent));

var retrievedObject = localStorage.getItem("students");
var stored          = JSON.parse(retrievedObject); <----newStudent1

var newStudent2 = [{
    "name":        "Mary",
    "age":         20,
    "nationality": "German"
}];


var stored = Object.assign(stored, newStudent2); <----Here newStudent1 is replaced by newStudent2


localStorage.setItem("students", JSON.stringify(stored)); // Here newStudent2 is replacing old object on localStorage
var result = localStorage.getItem("students");

console.log(result);

您可以尝试创建一个对象数组并在创建新对象时附加它们。

var objects = []
objects.push(stored) 

localStorage.setItem('students', JSON.stringify(objects))

【讨论】:

  • 是的,这就是问题所在。谢谢迭戈
【解决方案3】:

您使用 Object.assign() 错误。有关它的信息,请参阅here

您真的需要 newStudent2 成为单个对象的数组吗?如果不是,您可以简单地执行stored.push(newStudent2),其中newStudent2 是一个对象,而不是具有单个对象的数组。

所以,类似:

var students = [];

// add the first student
// Notice how the student is now an object and not an array containing an object.
var newStudent = {
     "name":        "John",
     "age":         21,
     "nationality": "Spanish"
 };

students.push(newStudent);

localStorage.setItem("students", JSON.stringify(students));


// Retrieve the object from storage to add a new student
var retrievedObject = localStorage.getItem("students");
var stored          = JSON.parse(retrievedObject);

// add a new student
// Notice how the student is now an object and not an array containing an object.
var newStudent2 = {
    "name":        "Mary",
    "age":         20,
    "nationality": "German"
};

stored.push(newStudent2);

// Update the storage
localStorage.setItem("students", JSON.stringify(stored));
var result = localStorage.getItem("students");

console.log(result);

【讨论】:

  • 嗨,米奇。谢谢。 stored.push() 似乎也有效。 Sergey 的解决方案帮助我了解我做错了什么,而且非常基础。 :(
  • @McRui 欢迎您。我同时更新了答案
【解决方案4】:

根据MDNThe Object.assign() method only copies enumerable and own properties from a source object to a target object

在你的情况下: var stored = JSON.parse(retrievedObject); 返回数组,你可以将 push 新对象添加到数组中:stored.push(newStudent2); 并将 stored 设置为 localStorage

【讨论】:

  • 是的,这是我遇到的第一个错误,因为它们不可写。谢谢zooblin
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-07
相关资源
最近更新 更多