Javascript localStorage unshift 数组在两个项目后停止追加
Javascript localStorage unshift array stops appending after two items
我有一个在页面加载时触发的javascript函数。我的目标是像这样将 json 字符串存储在 localStorage 中,"item1","item2","item3"
使用 unshift 方法一次在数组中构建一个项目。
这是我的函数在这里的样子:
function storedItems (){
var modelItem = $('#item').html(),
modelInt = $('#int').html();
if (localStorage.modelItem || localStorage.modelInt) {
var itemStack = [],
intStack = [],
itemStorage = localStorage.getItem("modelItem"),
intStorage = localStorage.getItem("modelInt"),
itemHistory = JSON.parse(itemStorage),
intHistory = JSON.parse(intStorage),
item = JSON.stringify(itemHistory).split(","),
int = JSON.stringify(intHistory).split(",");
alert("History " + item + " " + int + " " + item.length + " " + int.length);
if (item.length > 0) {
for ( var i = item.length - 1; i >= 0; i--) {
var obj = item[i],
newItem = JSON.parse(obj);
if(item.length > 1 && item.length < 3) {
itemStack.unshift(newItem);
itemStack.unshift(modelItem);
alert("StringFinder 2 " + modelItem + " " + itemStack);
} else {
newItem.unshift(modelItem);
alert("StringFinder 2 " + modelItem + " " + itemStack);
}
}
}
if (int.length > 0) {
for ( var i = int.length - 1; i >= 0; i--) {
var obj = int[i],
newInt = JSON.parse(obj);
if(int.length > 1 && int.length < 3) {
intStack.unshift(newInt);
intStack.unshift(modelInt);
alert("StringFinder 2 " + modelInt + " " + intStack);
} else {
newInt.unshift(modelInt);
localStorage.setItem("modelInt", JSON.stringify(newInt));
alert("StringFinder 2 " + modelInt + " " + intStack);
}
}
}
localStorage.setItem("modelItem", JSON.stringify(itemStack));
localStorage.setItem("modelInt", JSON.stringify(intStack));
alert("StringFinder 4 " + itemStack + " " + intStack);
} else {
localStorage.setItem("modelItem", JSON.stringify(modelItem));
localStorage.setItem("modelInt", JSON.stringify(modelInt));
}
}
我可以"item1","item2"
得到这个结果,但如果它第三次触发,脚本会在第一个历史记录警报触发后失败。我基本上被难住了。我一直在寻找解决方案,并与其他一些人合作,试图弄清楚但没有成功。请尽你所能提供帮助。
您遇到的错误的原因在这里:
localStorage.setItem("modelItem", JSON.stringify(modelItem));
localStorage.setItem("modelInt", JSON.stringify(modelInt));
您正在对字符串值进行 JSON 编码并将其存储在本地存储中,因此当您将它们从本地存储中取出并解析它们时,它们仍然是字符串,而不是数组。
首先,您需要将它们存储为数组:
localStorage.setItem("modelItem", JSON.stringify([modelItem]));
localStorage.setItem("modelInt", JSON.stringify([modelInt]));
我已经让你的代码进入工作状态,你可以在这里尝试一下:
http://jsfiddle.net/5qad1nwe/1/
为了将来参考,正如我几个小时前指出的那样,如果你想在这里得到一个体面的答案,你必须提炼出你的问题的本质。在许多情况下,这种返工和简化代码的行为通常可以让您自己解决问题,而无需询问。
以下是您如何提出此问题并获得快速答案(以及可能的赞成票(的示例
<小时 />我在 localStorage 中存储和检索值时遇到问题。当它们尚未在 localStorage 中定义时,我第一次存储这些值(它们只是常规字符串值,没有多大重要性(,然后下次我从 localStorage 访问它们时,我想将它们作为数组检索,将其内容与另一个值一起复制到另一个数组,并重新存储值:
var modelItem = $('#item').html();
if (localStorage.modelItem ) {
var itemStack = []
itemStorage = localStorage.getItem("modelItem"),
itemHistory = JSON.parse(itemStorage);
console.log("itemHistory.length is " + itemHistory.length);
for (var i = 0; i < itemHistory.length; i++) {
itemStack.unshift(itemHistory[i]);
}
itemStack.unshift(modelItem);
localStorage.setItem("modelItem", JSON.stringify(itemStack));
} else {
localStorage.setItem("modelItem", JSON.stringify(modelItem));
}
但是,当我第一次从 localStorage 加载数据时,itemHistory.length
不是我预期的 1,而是实际上更大的值。我做错了什么?
这是我自己答案的解决方案。对于混乱,我深表歉意。我在这里简化并修复了它。
var modelItem = $('#item').html();
if (localStorage.modelItem) {
itemStorage = localStorage.getItem("modelItem");
itemHistory = JSON.parse(itemStorage);
alert(itemHistory.length);
if (itemHistory.length > 0) {
if(itemHistory.length < 3) {
itemHistory.unshift(modelItem);
alert("StringFinder 2 " + itemHistory);
} else {
itemHistory.unshift(modelItem);
itemHistory.pop();
alert("StringFinder 3 " + itemHistory);
}
}
localStorage.setItem("modelItem", JSON.stringify(itemHistory));
alert("StringFinder 4 " + itemHistory);
} else {
var itemStack = new Array();
itemStack.unshift(modelItem);
localStorage.setItem("modelItem", JSON.stringify(itemStack));
}
这是最新的 JSFiddle
- 如何使用仅显示/查看两个项目的甘特图
- 使用javascript根据值将项目分组到两个级别
- 使弹性项目一次包装两个
- Javascript 库,一次包含两个项目
- 请问JavaScript中的两个项目有什么区别
- 下划线.js,从一个对象中获取两个项目并添加到顶部
- 如何在两个不同数组中的项目之间建立链接
- Javascript localStorage unshift 数组在两个项目后停止追加
- Javascript 比较两个大小不同的数组,并返回不在第二个数组中的项目
- 如何在 mvc 项目中同步这两个计时器
- Maven结合了两个项目
- 缩放两个项目
- 在同一集合中添加两个项目
- 下拉|材料设计|两个项目|重叠
- 如何在MVC上的两个列表框之间移动项目-JQuery不起作用
- 显示基于彼此的两个下拉列表中的项目
- select2.js-如何在选项元素内对齐两个项目
- 筛选和比较两个项目的列表
- 猫头鹰旋转木马,一次滚动两个项目
- 如何在列表框中获得选定项目的索引,并添加到列表框两个按钮