Code Signal矩阵求和问题:第二种JavaScript解法为何报错?
错误分析:Cannot read properties of undefined (reading 'length')
这是Code Signal上的一道矩阵求和题,要求实现函数,输入矩阵后返回所有不在0下方的元素之和。
示例矩阵:
matrix = [[1, 1, 1, 0], [0, 5, 0, 1], [2, 1, 3, 10]]
正确输出:solution(matrix) = 9
正确解法逻辑
以下代码可正常运行,核心是按列优先遍历:先遍历每一列,在每一列中从上到下累加元素,遇到0就停止该列的遍历:
function solution(matrix) { let sum = 0 for(j=0;j<matrix[0].length;j++){ for(let i=0;i<matrix.length;i++){ if(matrix[i][j]==0){ break } else { sum += matrix[i][j] } } } return sum }
错误解法的问题根源
第二种解法的报错Uncaught TypeError: Cannot read properties of undefined (reading 'length'),完全是因为外层循环的终止条件写错了:
// 错误的终止条件 for(j=0;j<matrix[j].length;j++){
这里犯了两个关键错误:
- 混淆行/列索引逻辑:矩阵的结构是
matrix[行号][列号],matrix[j]代表第j行,而非第j列的长度。 - 索引越界导致undefined:外层循环的j是列索引,取值范围应是
0到列数-1(即matrix[0].length -1)。当矩阵列数大于行数时,j会超过矩阵的最大行索引,此时matrix[j]变为undefined,读取undefined.length自然触发类型错误。
拿题目示例矩阵举例:矩阵有3行(matrix.length = 3)、4列(matrix[0].length =4)。当j循环到3时,matrix[3]不存在(行索引最大为2),此时matrix[3]是undefined,尝试读取它的length就会抛出报错。
总结
遍历矩阵列时,列总数应取矩阵任意一行的长度(通常取第一行matrix[0].length,前提是矩阵非空且为矩形),而非用列索引j去访问matrix[j]的长度——这会在列数大于行数时直接触发索引越界,导致读取undefined的属性报错。
内容的提问来源于stack exchange,提问作者od507
相关产品推荐
相关产品推荐

