尝试在JavaScript中迭代JSON数组时出错

我有JSON文件,我加载在js代码没有问题使用JSON.parse() (这里显示的文件缩减的例子,它是25项长 ):

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

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

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

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

 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 ****/ } 

你的对象包含4 Term ,循环次数为4,但在上一次迭代中j+=1使j=5searchTerms[5]没有对象。这就是为什么你的代码不工作。 我写样本program.I希望这可以帮助你:

 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(); 

那是因为你增加了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); } 

你可以试试这个

 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); } 

你面临的真正问题是你的j-index需要一个不包含在你的JSON对象中的项目。 我发现你的周期没有理由在logging你的条款的时候增加你的索引variables。

如果指定了这个索引增量,那么在使用它作为索引访问器之前,需要考虑j的值是否等于或大于searchTerms的长度。

删除它或处理它。

你可以使用一个默认的对象,它可以解决错误,但是也会返回undefined

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

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

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