У меня есть объект json, который я использую для цикла for, и когда цикл достигает длины данных, я получаю сообщение об ошибке
Uncaught TypeError: Cannot read property 'RoomName' of undefined
Похоже, он хочет продолжать зацикливаться и ничего не находить.
Почему он это делает? Разве он не должен был выйти из цикла for, когда достиг длины данных 4?
$(document).ready(function () {
var data2 = [
{ "RoomID": 1, "RoomName": "Room 1", "Areas": [{ "id": 1, "AreaName": "Area 1" }, { "id": 10, "AreaName": "Area 10" }] },
{ "RoomID": 2, "RoomName": "Room 2", "Areas": [{ "id": 2, "AreaName": "Area 2" }, { "id": 20, "AreaName": "Area 20" }] },
{ "RoomID": 3, "RoomName": "Room 3", "Areas": [{ "id": 3, "AreaName": "Area 3" }, { "id": 30, "AreaName": "Area 30" }, { "id": 35, "AreaName": "Area 35" }] },
{ "RoomID": 4, "RoomName": "Room 4", "Areas": [{ "id": 4, "AreaName": "Area 4" }, { "id": 40, "AreaName": "Area 40" }] }
];
// Data2
console.info("data2's length is: " + data2.length);
for (i = 0; i <= data2.length; i++) {
console.info(data2[i].RoomName);
if (data2[i].Areas.length > 0) {
for (j = 0; j < data2[i].Areas.length; j++) {
console.info(" - " + data2[i].Areas[j].AreaName);
}
}
}
});<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Проблема в "=" в этой строке
for (i = 0; i <= data2.length; i++) {
Если вы измените его на
for (i = 0; i < data2.length; i++) {
все должно быть хорошо.
Это происходит потому, что массив имеет нулевой индекс и поэтому длина массива на 1 больше, чем индекс итерации.
У вас есть следующий цикл for:
for (i = 0; i <= data2.length; i++)
Но последний индекс массива - data2.length - 1. Вот почему ваш последний элемент - undefined. Измените строку выше на следующий код
for (i = 0; i < data2.length; i++)
Вот рабочий код:
$(document).ready(function () {
var data2 = [
{ "RoomID": 1, "RoomName": "Room 1", "Areas": [{ "id": 1, "AreaName": "Area 1" }, { "id": 10, "AreaName": "Area 10" }] },
{ "RoomID": 2, "RoomName": "Room 2", "Areas": [{ "id": 2, "AreaName": "Area 2" }, { "id": 20, "AreaName": "Area 20" }] },
{ "RoomID": 3, "RoomName": "Room 3", "Areas": [{ "id": 3, "AreaName": "Area 3" }, { "id": 30, "AreaName": "Area 30" }, { "id": 35, "AreaName": "Area 35" }] },
{ "RoomID": 4, "RoomName": "Room 4", "Areas": [{ "id": 4, "AreaName": "Area 4" }, { "id": 40, "AreaName": "Area 40" }] }
];
// Data2
console.info("data2's length is: " + data2.length);
for (i = 0; i < data2.length; i++) {
console.info(data2[i].RoomName);
if (data2[i].Areas.length > 0) {
for (j = 0; j < data2[i].Areas.length; j++) {
console.info(" - " + data2[i].Areas[j].AreaName);
}
}
}
});<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>Вы используете <= data2.length в своем первом цикле for.
console.info(data2.length) //expected '4'
фактическая длина вашего массива равна «3», поскольку массивы начинаются с 0., но .length вместо этого возвращает его длину, начиная с 1.
Итак, если i===4, это равный для data2.length, но наивысшая точка в data2 будет 3.
console.info(typeof data2[3]) expected: 'object'
console.info(typeof data2[4]) expected: 'undefined'
Да, это помогло, я приму ответ, когда мне будет позволено.