JavaScript二维数组 Cannot read property 'push' of undefined

用JS刷LeetCode,刷到第六题ZigZag Conversion报错TypeError: Cannot read property 'push' of undefined

/**
 * @param {string} s
 * @param {number} numRows
 * @return {string}
 */
var convert = function(s, numRows) {
    var rowArray = new Array(numRows),
        dir = true,
        n = 1,
        i = 0,
        temp = 0,
        rowArrayCount = 0,
        ans = "",
        len = s.length;
    
    for (i = 0; i < numRows; i++) {
        rowArray[i] = new Array();
    }
    
    while (i<len) {
        console.log(rowArray);
        console.log(rowArray instanceof Array);
        console.log(rowArray[rowArrayCount] instanceof Array);
        while(dir) {
            rowArray[rowArrayCount].push(s.charAt(i));
            rowArrayCount++;
            i++;
            if (i === numRows*n -1) {
                dir = false;
                n++;
                rowArrayCount = numRows-1;
            }
        }
        while(!dir) {
            rowArray[rowArrayCount].push(s.charAt(i));
            rowArrayCount--;
            i++;
            if (i === numRows*n -1) {
                dir = true;
                n++;
                rowArrayCount = 0;
            }
        }
    }
    
    for (i = 0; i < numRows; i++) {
        temp = rowArray[i].join("");
        ans += temp;
    }
    return ans;
};

其中

console.log(rowArray);
console.log(rowArray instanceof Array);
console.log(rowArray[rowArrayCount] instanceof Array);

输出为:

clipboard.png

为什么rowArray[rowArrayCount]是数组却不能使用push方法?

阅读 6.2k
4 个回答

已解决,确实是数组越界,导致rowArray没有rowArray[rowArrayCount]项,所以为undefined。不过问题书出在i上,忽略了用for循环创建二维数组时临时变量i在for循环结束后作用域问题,此时i的值是for循环结束时的值。应该把i重新设置为0。
正确的代码:

/**
 * @param {string} s
 * @param {number} numRows
 * @return {string}
 */
 var convert = function(s, numRows) {
    if(numRows === 1) {
        return s;
    }
    var rowArray = new Array(numRows),
        dir = true,
        n = 1;
        i = 0,
        temp = 0,
        rowArrayCount = 0,
        ans = "",
        len = s.length;
    
    for (i = 0; i < numRows; i++) {
        rowArray[i] = new Array();
    }
    i = 0; //将i重新设置为0
    while (i<len) {
        while(dir) {
            rowArray[rowArrayCount].push(s.charAt(i));
            rowArrayCount++;
            i++;
            if (i === (numRows-1)*n) {
                dir = false;
                n++;
                rowArrayCount = numRows-1;
            }
        }
        while(!dir) {
            rowArray[rowArrayCount].push(s.charAt(i));
            rowArrayCount--;
            i++;
            if (i === (numRows-1)*n) {
                dir = true;
                n++;
                rowArrayCount = 0;
            }
        }
    }
    
    for (i = 0; i < numRows; i++) {
        temp = rowArray[i].join("");
        ans += temp;
    }
    return ans;
};

rowArrayCount = numRows-1
这里rowArrayCount可能导致数组越界

while(dir) {
    console.log(rowArray[rowArrayCount])
    rowArray[rowArrayCount].push(s.charAt(i));
    rowArrayCount++;
    i++;
    if (i === numRows*n -1) {
        dir = false;
        n++;
        rowArrayCount = numRows-1;
    }
}

越界了。

出现这个错误是因为该对象不是数组,这时rowArray没有第rowArrayCount项,所以rowArray[rowArrayCount]是undefined,不是题主所说的 "rowArray[rowArrayCount]是数组却不能使用push方法"。所以排错就看看为什么rowArrayCount是多少

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题