2017-09-08 31 views
1

我無法弄清楚爲什麼這段代碼是給我For循環迭代<VS <= JavaScript的基本面

TypeError: Cannot read property '0' of undefined

function fromListToObject(array) { 
 
    // make new empty object to store key:value in 
 
    var obj = {}; 
 
    // loop over the given array 
 
    for (var i = 0; i <= arr.length; i++){ 
 
    //every iteration keys gets stored with new key 
 
    var keys = arr[i][0]; 
 
    // same here 
 
    var values = arr[i][1]; 
 
    //pushing new key:value into obj 
 
    obj[keys] = values; 
 
    } 
 
    return obj; 
 
} 
 
var arr= [['1', 'One'], ['2', 'Two'], ['3', 'Three'], ['4', 'Four'], ['5', '5']]; 
 
var result = fromListToObject(arr); 
 

 
console.log(result);

我已經試過: 當我在fromListToObject()函數內運行for循環時,只需i < arr.length就可以工作。我試着尋找答案,但我可能會以錯誤的方式提問。 循環不應該使用「=」運算符嗎?

+0

它的下跌有@ 4castle – turmuka

+1

數組從0開始,所以array.length,是1過去的最後一個項目..'< '是正確的比較。 – Keith

+0

它實際上不會影響問題或結果,具體而言,但是您的代碼中存在細微的錯誤;你將一個參數作爲'array'傳遞給函數,然後在函數內引用外部變量'arr'。如果你再次調用該函數(例如'fromListToObject(arr2)'),你不會得到你期望的結果。 – Claies

回答

5

如果您有一個包含10個元素的數組,並且您從1開始計數 - 最後一個元素將被放置在10th位置。

但是,如果您以0(這是陣列工作的方式)開始計數,最後的位置將是length - 1(在本例中爲9)。

在您的示例中 - for循環以0開頭,並應計入陣列中位於length - 1位置的最後一個元素。
那個地方也<length(因爲當我們到=length - 這是「走出陣」 - 你試圖在不存在的地方訪問一個元素):

for (var i = 0; i < arr.length; i++) { 
    ... 
} 

注意完全相同的方式,你可以這樣做:

for (var i = 1; i <= arr.length; i++) { 
    // Note that here you would want to access the elements 
    // in the array using arr[i-1] 
    ... 
} 

但是這是不常見的。

你有另一種選擇是使用數組的forEach方法:

arr.forEach(function(element) { 
    ... 
}); 
+0

你的第一個替代例子('for(var i = 1; i <= arr.length; i ++){')是不正確的.....我認爲你在考慮'(var i = 0; i < = arr.length-1; i ++)' – Claies

+0

@Claies它確實。我沒有寫關於循環內部「i」的用法。如果你使用'arr [i-1]',它可以很好地工作...... – Dekel

+0

對,你也可以這樣做,但我想你可能想更清楚一點,因爲它改變的不僅僅是單一行,乍一看可能會讓人困惑。 – Claies