Цикл while не останавливается, когда ячейка 2D-массива не определена (javascript)

#javascript #arrays #multidimensional-array #while-loop #do-while

#javascript #массивы #многомерный массив #цикл while #do-while

Вопрос:

Цель: пробежаться по столбцам 2D-массива (берется из файла Excel с неравномерной длиной столбцов) и поместить существующие записи в их собственный массив.

Что я сделал: длина самого длинного столбца составляет 90 записей, что является вторым столбцом в файле Excel, а самый короткий равен 30, что является первым столбцом. Я настроил for цикл для просмотра каждого столбца и while цикл для просмотра каждой записи, пока она существует, и добавления ее в новый массив.

Исходный (иш) код:

     //read in Excel file into 2D array called "myExcel"

    var columnNames = ["shortest", "longest", "irrelevant"];

    shortArray = [];
    longArray = [];
    irrArray = [];
    var s

    for (var i = 0; i < columnNames.length; i  ) {        
      var columnName = columnNames[i];
      s = 0;

      while (myExcel[s][columnName]) {

        if ((columnName === "shortest")) {
          var row = myExcel[s][columnName];
          shortArray.append(row);            
          s  ;

        } else if ((columnName === "longest")) {
          var row = myExcel[s][columnName];
          longArray.append(row);            
          s  ;

        } else if ((columnName === "irrelevant")) {
          var row = myExcel[s][columnName];
          irrArray.append(row);            
          s  ;
        }
      }
    }
  

Проблема: это работает только наполовину. Он проходит через первый столбец (30 строк) просто отлично — он останавливается, когда myExcel[s][columnName] больше не существует (когда columnName = "shortest" и после s = 29 ). Затем он проходит весь путь до columnName = "longest" конца и s = 89 выдает мне ошибку «TypeError: не удается прочитать свойство ‘longest’ из undefined». Я предполагаю, что это потому, что он пытается пройти через строку 90, которой не существует. Но я думал, что на этом мой цикл while остановится.

Что я пробовал:

выполнить цикл while

     //blah

      do {

        //blah

      } while (myExcel[s][columnName]);
  

Добавлено дополнительное условие цикла while

     //blah

      while ((myExcel[s][columnName]) amp;amp; s<myExcel.length) {

        //blah

      }
  

Использование typeof

     //blah

      while (typeof (myExcel[s][columnName]) === 'string') { //also used this with !=='undefined' and ==='string' when I added a number to the end of each row in the Excel sheet

        //blah

      }
  

И в основном каждая из этих комбинаций (и, вероятно, многое другое, что я забываю). Я уверен, что это легко исправить, но я потратил несколько дней, пытаясь понять это, поэтому, думаю, на данный момент я должен обратиться за помощью. Я также специалист по MATLAB, и недавно мне пришлось изучать как Python, так и Javascript из-за COVID, так что это может быть проблемой с переключением языка (хотя я так не думаю, потому что я гуглил и возился с этим в течение нескольких дней).). Любая помощь была бы очень признательна!

Комментарии:

1. Обновление: я добавил console.log(myExcel[s][columnName], s); после цикла while amp; перед операторами if / else и снова после операторов if / else, но все еще в цикле while (помечено «до» и «после» в консоли). Итак, я получаю before: glasses 0; after: paper 1; before: paper 1 и так далее. Прежде чем он зависнет, он имеет before: river 88; after: mushroom 89; before: mushroom 89 . Таким образом, он доходит до начала последнего цикла while и знает, что слово существует, но при его достижении возникает проблема if columnName === "longest" , хотя до последнего прогона этого не было. @Thomas @Fasid

Ответ №1:

В вашем цикле while измените проверку на,

 while(myExcel[s] amp;amp; myExcel[s][columnName] ) {

  

Если вы пишете современный Js, то вы могли бы просто дополнительно связать его следующим образом, while(myExcel[s]?.[columnName])

Дело в том, что вы пытаетесь пройти внутри внешнего массива. Но сначала вам нужно проверить, существует ли внешний массив, а затем проверить внутренний массив.

Комментарии:

1. Спасибо за ответ! К сожалению, он все еще останавливается в той же точке. 🙁 Есть ли что-то еще, что может пойти не так?

Ответ №2:

Я не совсем понимаю ваш подход, но я думаю, что вы ищете это:

 var shortArray = [];
var longArray = [];
var irrArray = [];

for(let row of myExcel){
  if(!row) continue; // not sure if this check is necessary.
  if(row.shortest) shortArray.append(row.shortest);
  if(row.longest) longArray.append(row.longest);
  if(row.irrelevant) irrArray.append(row.irrelevant);
}
  

Комментарии:

1. Спасибо за ответ! Честно говоря, я просто пытался понять, как перевести мой код на python, поэтому метод может быть странным. Записывает ли «.ColumnName», как вы автоматически вызываете столбцы, или я должен определить это в какой-то момент?