2015-09-17 30 views
0

我正在做一些Javascript的基礎知識。我從左到右添加子數組的值(這些值將是17,5,1,9,24),從右到左(這些值將是13,3,1,7,21)。我的左到右功能的偉大工程!不過當它達到我的左功能權限是拋出一個錯誤:遍歷數組向後錯誤

for(var i = matrixArray.length; i > 0 ; i--){ 
    rightToLeftHorizontalValues.push(matrixArray[i][i]); 
} 

錯誤說:遺漏的類型錯誤:無法讀取屬性未定義

「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(); 

在這一點上我似乎無法弄清楚我要去哪裏錯了。

回答

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]); 
} 
+0

@Jeff Noel這樣做的竅門!我想我已經出去了一點點。謝謝。我會在11分鐘內接受你的回答。 – Josh

+0

@Wes不是i> = 0而不是i> 0? – g2000

+0

@achan好的電話,我會編輯。 –

0

此問題是由於你的賦值給數組的長度。

var i = matrixArray.length; 

這使得i = 5在第一次迭代。但是,因爲有5個元素,你的指數去從0到4(含),不5.因此,條件還必須包括0指數,也就是i >= 0,而不是i > 0

解決這一問題的方法是在初始值分配給length - 1

for (var i = matrixArray.length - 1; i >= 0 ; i--) { 
    rightToLeftHorizontalValues.push(matrixArray[i][i]); 
} 

另一種方法是使用while語法,我傾向於向後遍歷的東西時,更喜歡。

var i = matrixArray.length; 
while (i--) { 
    rightToLeftHorizontalValues.push(matrixArray[i][i]); 
} 

有些人可能不喜歡它,因爲它使用的副作用表達式作爲條件。我不喜歡那麼多,但它確實很緊湊。