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

Javascript迭代本地存储JSON对象(普通Javascript),javascript,json,iteration,Javascript,Json,Iteration,因此,我想迭代存储在浏览器本地存储中的JSON对象。 基本上,JSON对象的外观和添加方式如下: if (localStorage.getItem("playerHighscoreObject") == undefined) { playerHighscoreList = [ {'name': "Ben", 'score': 40}, {'name': "Joe", 'score': 44}, {'name': "Anna", 'score': 51}, {'name': "Mi

因此,我想迭代存储在浏览器本地存储中的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个未定义的值。即使我打印了JSON对象,它也会按原样显示

[{"name":"Ben","score":40},{"name":"Joe","score":44},{"name":"Anna","score":51},{"name":"Mitch","score":59},{"name":"Abdi","score":63}]
我做错了什么

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

一旦您解决了发现和解决的问题

(更多信息请参见下文。)

…那么在其核心,这与本地存储或JSON无关。您希望在对象数组中循环并访问数组中对象的属性

代码的问题是

  • 您正在使用
    for in
    ,它不用于在数组中循环;有一套完整的循环数组的方法

  • 您正在覆盖
    键的值

  • 您试图使
    执行双重任务

  • 相反,请使用任何常规方法在数组中循环,例如
    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}
    ];
    
    一旦您更新了它,就保存它(在更新它之前没有特殊的理由保存它,就像您的原始代码那样):


    您还可以考虑生成本地存储名和变量名匹配。< /P> < P>一旦找到了找到的问题和

    (更多信息请参见下文。)

    …那么在其核心,这与本地存储或JSON无关。您希望在对象数组中循环并访问数组中对象的属性

    代码的问题是

  • 您正在使用
    for in
    ,它不用于在数组中循环;有一套完整的循环数组的方法

  • 您正在覆盖
    键的值

  • 您试图使
    执行双重任务

  • 相反,请使用任何常规方法在数组中循环,例如
    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}
    ];
    
    一旦您更新了它,就保存它(在更新它之前没有特殊的理由保存它,就像您的原始代码那样):


    您也可以考虑使用本地存储名和变量名匹配。有没有JSON.parse?@Dimava:Oooh,我完全错过了。

    stringify
    在那里,但是缺少了
    parse
    。“尽管我打印了JSON对象,它显示为它应该显示的样子”,但您获得特定输出的事实意味着
    playerHighscoreList
    是一个字符串。记录数组/对象会产生稍微不同的输出。是否可能是.Dupe的副本?有没有JSON.parse
    ?@Dimava:Oooh,我完全错过了。
    stringify
    在那里,但是缺少了
    parse
    。“尽管我打印了JSON对象,它显示为它应该显示的样子”,但您获得特定输出的事实意味着
    playerHighscoreList
    是一个字符串。记录数组/对象会产生稍有不同的输出。可能是的重复。