Как убрать ошибку 'Cannot read property' при работе с json-объектом?

Есть функция, в которой производится обработка JSON:
function drawPlaces(json,section) {
      var container;
      var circleClass;
      var statusObj;
      switch (section) {
        case 'VIP':
          container = '#VIP_0020parter';
          break;
        case 'Партер':
          container = '#parter';
          break;
        case 'Бельэтаж':
          container = '#belletaj';
          break;
        case 'Балкон':
          container = '#balcony';
          break;
      }
      console.log('DrawPlaces: '+section);
      console.log(json.length);
      for (var i = 0; i <= json.length; i++){
          var obj = json[i];
          statusObj = obj.status;
          console.log(statusObj);
          switch (statusObj) {
            case 'Забронировано':
              circleClass = 'reserved'
              break;
          case 'В обработке':
            circleClass = 'reserved'
            break;
            case 'Куплено':
              circleClass = 'closed';
              break;
          }
          console.log(circleClass);
          console.log(json[i].row);
          console.log(json[i].col);
          console.log(container);
          $(container).find('[tc-row-no='+json[i].row+']').find('[tc-seat-no='+json[i].col+']').addClass(circleClass);
      }
    }

Компилятор ругается на строку в цикле: statusObj = json[i].status;
Ошибка такая : Uncaught TypeError: Cannot read property 'status' of undefined;

Причем в консоли statusObj выводится нормально. В чем может быть причина?
  • Вопрос задан
  • 579 просмотров
Решения вопроса 2
evgeniy8705
@evgeniy8705
Повелитель вселенной
function drawPlaces(json, section) {
  let container;
  let circleClass;
  let statusObj;

  switch (section) {
    case "VIP":
      container = "#VIP_0020parter";
      break;
    case "Партер":
      container = "#parter";
      break;
    case "Бельэтаж":
      container = "#belletaj";
      break;
    case "Балкон":
      container = "#balcony";
      break;
  }

  for (let item of JSON.parse(json)) {
    switch (item.status) {
      case "Забронировано":
        circleClass = "reserved"
        break;
      case "В обработке":
        circleClass = "reserved"
        break;
      case "Куплено":
        circleClass = "closed";
        break;
    }

    $(container).find(`[tc-row-no=${item.row}]`).find(`[tc-seat-no=${item.col}]`).addClass(circleClass);
  }
}
Ответ написан
Комментировать
Krasnodar_etc
@Krasnodar_etc
fundraiseup
for (var i = 0; i <= json.length - 1; i++){ - я думаю, так должно быть лучше.
Такая ошибка значит, что json[i] - undefined скорее всего. Если вы используете перебор массива, то у последнего элемента индекс равен array.length - 1

А вообще, легче использовать forEach вместо for :)

PS - консоль отрабатывает нормально, потому что вообще отрабатывает последний раз на предыдущей интерации цикла. Поставьте её после объявления obj и выводите json[i] - увидите проблему
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы