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

发布于 2022-09-11 16:16:04 字数 1725 浏览 15 评论 0

用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方法?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

小女人ら 2022-09-18 16:16:04

已解决,确实是数组越界,导致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;
};
烙印 2022-09-18 16:16:04

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

゛清羽墨安 2022-09-18 16:16:04
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;
    }
}

越界了。

尾戒 2022-09-18 16:16:04

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文