我正在用Javascript做一些基础知识。我从左到右添加子数组的值(这些值将是17,5,1,9,24)和从右到左(这些值将是13,3,1,7,21)。我从左到右的功能很棒!但是我的右到左功能在到达时会抛出错误:
for(var i = matrixArray.length; i > 0 ; i--){
rightToLeftHorizontalValues.push(matrixArray[i][i]);
}
错误说明:未捕获的TypeError:无法读取未定义的属性“5”
var matrixArray = [
[17, 16, 15, 14, 13],
[18, 5, 4, 3, 12],
[19, 6, 1, 2, 11],
[20, 7, 8, 9, 10],
[21, 22, 23, 24, 25]
];
function matrixFundemental(){
function leftToRightValues() {
horizontalTotalLeftToRight = 0;
leftToRightHorizontalValues = [];
for(var i = 0; i < matrixArray.length; i++){
leftToRightHorizontalValues.push(matrixArray[i][i]);
}
for (var i = 0; i < leftToRightHorizontalValues.length; i++){
horizontalTotalLeftToRight += leftToRightHorizontalValues[i];
}
console.log(horizontalTotalLeftToRight)
}
function rightToLeftValues() {
horizontalTotalRightToLeft = 0;
rightToLeftHorizontalValues = [];
for(var i = matrixArray.length; i > 0 ; i--){
rightToLeftHorizontalValues.push(matrixArray[i][i]);
}
for (var i = 0; i < rightToLeftHorizontalValues.length; i++){
horizontalTotalLeftToRight += rightToLeftHorizontalValues[i];
}
console.log(horizontalTotalRightToLeft)
}
leftToRightValues();
rightToLeftValues();
};
matrixFundemental();
此时我似乎无法弄清楚我哪里出错了。
答案 0 :(得分:3)
这是因为array.length
将返回5,但array[5]
不存在。有5个条目,但是,第一个索引从零开始。
您需要从array.length - 1
(即4)
for(var i = matrixArray.length-1; i >= 0 ; i--){
rightToLeftHorizontalValues.push(matrixArray[i][i]);
}
答案 1 :(得分:0)
此问题是由于您分配了数组的长度。
var i = matrixArray.length;
这会在第一次迭代中生成i = 5
。但是,由于有5个元素,您的索引从0到4(包括),而不是5.因此,条件还必须包含0索引,即i >= 0
,而不是{{1} }。
解决此问题的方法是将初始值分配给i > 0
。
length - 1
另一种方法是使用for (var i = matrixArray.length - 1; i >= 0 ; i--) {
rightToLeftHorizontalValues.push(matrixArray[i][i]);
}
语法,在向后遍历内容时我更倾向于这种语法。
while
有些人可能不喜欢它,因为它使用带副作用的表达式作为条件。我自己并不喜欢它,但它确实很紧凑。