Javascript 迭代本地存储 JSON 对象 (Vanilla Javascript)

标签 javascript json iteration

所以我想迭代存储在浏览器本地存储中的 JSON 对象。 基本上 JSON 对象的外观和添加方式如下:

if (localStorage.getItem("playerHighscoreObject") == undefined) {
playerHighscoreList = [
  {'name': "Ben", 'score': 40},
  {'name': "Joe", 'score': 44},
  {'name': "Anna", 'score': 51},
  {'name': "Mitch", 'score': 59},
  {'name': "Abdi", 'score': 63}
];
localStorage.setItem("playerHighscoreObject", JSON.stringify(playerHighscoreList));
} 
else {
playerHighscoreList = localStorage.getItem("playerHighscoreObject");
}

然后我想迭代该对象并检查“score”键并将这些值与潜在的新条目进行比较。

function saveScore() {
  var key = "score";
  console.log(playerHighscoreList);
  for (key in playerHighscoreList) {
    if (playerHighscoreList.hasOwnProperty(key)) {
      var val = playerHighscoreList[key];
      console.log(val);
    }
  }
}

但是,当我这样做时,我在日志中收到 135 undefined 。即使我打印了 JSON 对象,它也按应有的样子显示

[{"name":"Ben","score":40},{"name":"Joe","score":44},{"name":"Anna","score":51},{"name":"Mitch","score":59},{"name":"Abdi","score":63}]

我在这里做错了什么?

编辑: 建议重复使用 jQuery 来解决问题。我不想使用 jQuery,而是使用标题中描述的普通 javascript。

最佳答案

一旦解决了 Dimava 的问题发现并 pointed out in a comment

else {
    playerHighscoreList = JSON.parse(localStorage.getItem("playerHighscoreObject"));
    //                    ^^^^^^^^^^---- this was missing
}

(更多内容见下文。)

...那么从本质上讲,这与本地存储或 JSON 无关。您想要循环访问对象数组并访问数组中对象的属性。

您的代码的问题在于

  1. 您使用的是for-in,它不是用于循环数组;而是用于循环数组。 my answer here有循环数组方法的完整概要

  2. 您正在覆盖key的值

  3. 您正在尝试让 key 执行双重任务

相反,使用任何常规方法循环遍历数组,例如 forEach:

function saveScore() {
  var key = "score";
  playerHighscoreList.forEach(function(entry) {
    if (entry.hasOwnProperty(key)) {
      var val = entry[key];
      console.log(val);
    }
  });
}
<小时/>

关于从本地存储检索对象,您可以使其变得更简单:

playerHighscoreList = JSON.parse(localStorage.getItem("playerHighscoreObject") || "null") || [
  {'name': "Ben", 'score': 40},
  {'name': "Joe", 'score': 44},
  {'name': "Anna", 'score': 51},
  {'name': "Mitch", 'score': 59},
  {'name': "Abdi", 'score': 63}
];

更新后,保存它(没有特别的理由在更新之前保存它,就像原始代码一样):

localStorage.setItem("playerHighscoreObject", JSON.stringify(playerHighscoreList));

您还可以考虑使本地存储名称和变量名称匹配。

关于Javascript 迭代本地存储 JSON 对象 (Vanilla Javascript),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39776258/

相关文章:

javascript - 为什么我不能在 Konva.Shape.fillPatternImage(imageObj) 中使用 Konva.Image()?

java - 解析数据时出错 org.json.JSONException : type java. lang.String 无法转换为 JSONObject

java - 用Java实现的计算斐波那契数列的算法给出了奇怪的结果

javascript - 从数组创建 li data-role=list-divider

javascript - CSS 分离头表技巧 : keep verticall scrollbar on screen and last cell go full width

php - 无法使用ajax从json获取多个值

python - 如何从值列表中将新列附加到 pandas groupby 对象

delphi - 如何将子树从一个 TTreeView 复制到另一个 TTreeView?

javascript - Angular - 何时使用 $scope 与不使用

javascript - 轻松自动完成,引用深层嵌套值