#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», как вы автоматически вызываете столбцы, или я должен определить это в какой-то момент?