迭代数组向后错误

时间:2015-09-17 19:59:38

标签: javascript arrays

我正在用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();

此时我似乎无法弄清楚我哪里出错了。

2 个答案:

答案 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

有些人可能不喜欢它,因为它使用带副作用的表达式作为条件。我自己并不喜欢它,但它确实很紧凑。

相关问题