【问题标题】:Error while trying to iterate JSON array in JavaScript尝试在 JavaScript 中迭代 JSON 数组时出错
【发布时间】:2017-05-23 05:57:23
【问题描述】:

我有 JSON 文件,我使用 JSON.parse() 在 js 代码中加载它没有问题(此处显示的文件的简化示例,它的 25 项长):

{
    "List": [
    {  "Term": "Tos"   },
    {  "Term": "Gripa" },
    {  "Term": "Catarro"}, 
    {  "Term": "Flemas"}
    ]
}

当我迭代它时,每次迭代访问一个项目我没有问题,但是当我尝试增加索引以访问每次迭代的项目时,它会引发以下错误(代码中的注释显示存在问题的行):

console.log(searchTerms[j].Term);

TypeError:无法读取未定义的属性“术语”

var data = fs.readFileSync(searchTermsFile);
var searchTerms = JSON.parse(data);
searchTerms = searchTerms.List;
for(var j=0;j<searchTerms.length;j+=4)
{
    console.log(searchTerms[j].Term);
    j+=1;
    console.log(searchTerms[j].Term); /****<---- THIS LINE THROWS THE ERROR ****/
}

【问题讨论】:

  • 你不能等待下一个周期吗?还是您需要在循环内部访问下一项?
  • 我每次迭代需要访问 5 个项目
  • 你不需要j+=1;,因为你已经有一个for循环。当您阅读时,在本例中为 3,它将转到 4 并尝试访问不存在的searchTerms[4]
  • @danielgoba84 告诉我们需求
  • 这是一个简化的代码,每次迭代我需要访问 5 个项目,我使用它们来创建请求,我还将连接它们以创建唯一的文件名

标签: javascript arrays json node.js


【解决方案1】:

您的对象包含 4 个 Term 并且您的 for 循环计数为 4,但 j+=1 在最后一次迭代中生成 j=5 并且 searchTerms[5] 中没有对象。这就是您的代码不起作用的原因。 我编写了示例程序。希望对您有所帮助:

var data = {
    "List": [
        {"Term": "1"},
        {"Term": "2"},
        {"Term": "3"},
        {"Term": "4"},
        {"Term": "5"},
        {"Term": "6"},
        {"Term": "7"},
        {"Term": "8"},
        {"Term": "9"},
        {"Term": "10"},
        {"Term": "11"},
        {"Term": "12"}
    ]
};

function test() {
  var searchTerms = data.List;
  var j = 0;
  var currentFiveObject = [];
  for (j = 0; j < searchTerms.length; j += 5) {
    currentFiveObject = [];
    for (var i = 0; i < 5; i++) {
      if (j + i < searchTerms.length)
        currentFiveObject.push(searchTerms[j + i])
      else
        break;
    }
    console.log(currentFiveObject);
  }
}
test();

【讨论】:

  • 好吧,我编辑了代码,但这不是问题,我简化了 JSON,为了节省空间,它有 25 个项目长,代码也被简化了,(将编辑)'j+=5' 和在循环内我更新'j'并且当'j'增加并尝试访问下一个元素时,即使在第一次迭代中它也会抛出错误
  • @danielgoba84 我为您的案例添加了示例代码。请测试一下
【解决方案2】:

那是因为您正在递增 j 然后检查 ,但是由于您正在迭代直到 length - 1 它会在 j += 1 之后超出范围,请尝试

var data = fs.readFileSync(searchTermsFile);
var searchTerms = JSON.parse(data);
searchTerms = searchTerms.List;for(var j=0;j<searchTerms.length - 1;j++)
{
 console.log(searchTerms[j].Term);
 j+=1;
 console.log(searchTerms[j].Term); 
}

【讨论】:

    【解决方案3】:

    你可以试试这个

    var data = fs.readFileSync(searchTermsFile);
    var searchTerms = JSON.parse(data);
    var i = 0;
    searchTerms = searchTerms.List;for(var j=0;j<searchTerms.length;j++)
    {
     i = j
     console.log((searchTerms[i] || {}).Term);
     i +=1;
     console.log((searchTerms[i] || {}).Term); 
    }
    

    【讨论】:

    • 不明白这应该如何工作,你能解释一下吗?
    【解决方案4】:

    您面临的真正问题是您的 j-index 需要一个未包含在 JSON 对象中的项目。我发现您的周期没有理由在记录您的条款期间增加您的索引变量。

    如果打算增加索引,那么在将其用作索引访问器之前,您需要考虑 j 的值是否等于或大于 searchTerms 长度。

    删除或处理它。

    【讨论】:

      【解决方案5】:

      您可以使用默认对象,它可以解决错误,但也会返回 undefined

      j += 1;
      console.log((searchTerms[j] || {}).Term);
      

      处理超出范围的索引的另一种方法是提前使用检查并防止使用大于最后一个索引值的索引。

      if (j < searchTerms.length) {
          // process item
          console.log(searchTerms[j].Term);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-08
        • 1970-01-01
        • 2021-10-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多