当未定义二维数组单元格时循环不会停止 (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);
}