我有JSON文件,使用JSON.parse()
加载js代码时没有问题(此处显示的文件的缩减示例, 25项长):< / p>
{
"List": [
{ "Term": "Tos" },
{ "Term": "Gripa" },
{ "Term": "Catarro"},
{ "Term": "Flemas"}
]
}
当我迭代它每次迭代访问一个项目时我没有问题,但是当我尝试增加索引以访问每次迭代的项目时,它会抛出以下错误(代码中的注释显示有问题的行):
的console.log(searchTerms [j]的.Term);
TypeError:无法读取属性&#39; Term&#39;未定义的
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 ****/
}
答案 0 :(得分: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();
答案 1 :(得分:0)
您可以使用默认对象来解决错误,但也会返回undefined
。
j += 1;
console.log((searchTerms[j] || {}).Term);
处理超出范围的索引的另一种方法是提前使用检查并防止使用大于上一个索引值的索引。
if (j < searchTerms.length) {
// process item
console.log(searchTerms[j].Term);
}
答案 2 :(得分:0)
这是因为你正在递增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 :(得分:0)
你可以试试这个
Ember
答案 4 :(得分:0)
您面临的真正问题是您的j-index需要一个未包含在JSON对象中的项目。我发现你的周期没有理由在记录你的条款时增加你的索引变量。
如果要进行索引增量,那么在将j用作索引访问器之前,需要考虑j的值是否等于或大于searchTerms长度。
删除它或处理它。