尝试在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=5
, searchTerms[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); }