当未定义二维数组单元格时循环不会停止 (javascript)
While loop not stopping when 2D array cell isn't defined (javascript)
目标: 运行 通过二维数组的列(来自列长度不均匀的 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
之后)它停止。然后,在给我错误“TypeError: Cannot read 属性 'longest' of undefined”之前,它一直通过 columnName = "longest"
和 s = 89
。我假设这是因为它正试图通过第 90 行,该行不存在。但我认为那是我的 while 循环停止的地方。
我尝试过的:
循环执行
//blah
do {
//blah
} while (myExcel[s][columnName]);
添加了额外的 while 循环条件
//blah
while ((myExcel[s][columnName]) && s<myExcel.length) {
//blah
}
使用类型
//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 人,最近因为 COVID 不得不同时学习 Python 和 Javascript,所以这可能是语言切换问题(尽管我不这么认为,因为我一直谷歌搜索并弄乱了好几天)。任何帮助将不胜感激!
在您的 while 循环中将检查更改为,
while(myExcel[s] && myExcel[s][columnName] ) {
如果你正在编写现代 Js,那么你可以像这样简单地选择链接它,while(myExcel[s]?.[columnName])
问题是,您正在尝试遍历外部数组。但是你首先需要检查外部数组是否存在,然后再去检查内部数组。
我不完全理解你的方法,但我认为你正在寻找这个:
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);
}
目标: 运行 通过二维数组的列(来自列长度不均匀的 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
之后)它停止。然后,在给我错误“TypeError: Cannot read 属性 'longest' of undefined”之前,它一直通过 columnName = "longest"
和 s = 89
。我假设这是因为它正试图通过第 90 行,该行不存在。但我认为那是我的 while 循环停止的地方。
我尝试过的:
循环执行
//blah
do {
//blah
} while (myExcel[s][columnName]);
添加了额外的 while 循环条件
//blah
while ((myExcel[s][columnName]) && s<myExcel.length) {
//blah
}
使用类型
//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 人,最近因为 COVID 不得不同时学习 Python 和 Javascript,所以这可能是语言切换问题(尽管我不这么认为,因为我一直谷歌搜索并弄乱了好几天)。任何帮助将不胜感激!
在您的 while 循环中将检查更改为,
while(myExcel[s] && myExcel[s][columnName] ) {
如果你正在编写现代 Js,那么你可以像这样简单地选择链接它,while(myExcel[s]?.[columnName])
问题是,您正在尝试遍历外部数组。但是你首先需要检查外部数组是否存在,然后再去检查内部数组。
我不完全理解你的方法,但我认为你正在寻找这个:
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);
}