2016-02-12 126 views
0

對不起,這可能是顯而易見的,但有人請向我解釋爲什麼這個由click事件調用的函數沒有帶有屬性對象的數組中的當前元素state:'active',將它改爲null,然後獲取數組中的下一個元素,也就是對象,並將其狀態屬性更改爲'active',但是會拋出錯誤消息,如'Can not set property' '未定義'的狀態?JavaScript的forEach數組方法不改變對象的屬性

提前謝謝!

var array = [{ 
    state : 'active' 
}, { 
    state : null 
}, { 
    state : null 
}]; 

document.addEventListener('click', function() { 
    array.forEach(function(element, index, array) { 
     if(element.state === 'active') { 
      element.state = null; 
      array[index+1].state = 'active'; 
     } 
    }); 
}); 
+0

,索引將爲array.length -1 ...陣列[索引+ 1],這是陣列[array.length],將未定義的,因此沒有財產狀態 –

+0

^Jaromanda是正確的。只要Array中的最後一個Object是活動的,你的'index + 1'就會越界,你會看到'undefined'錯誤。您將需要重新處理您的邏輯以適當地處理數組中的最後一個元素(向後移動一個,返回到開始處,任何適合您的應用程序的位置)。 – erictgrubaugh

+0

ahh ok ...看到我認爲第二個元素的狀態值會改變,然後錯誤會被拋出,但我明白了爲什麼現在。謝謝! – Nalyd

回答

0

的問題不在於它沒有做到這一點,它確實做到這一點,但隨後的循環繼續,現在下一個元素是「積極的」。它會這樣做,直到最後一個元素拋出並出錯,因爲你試圖訪問一個超出數組的索引。

嘗試這種情況:在的forEach最後一次迭代

var i = null; 
array.forEach(function(element, index, array) { 
    if(element.state === 'active') { 
     i = index; 
    } 
}); 

if (i !== null && i + 1 < array.length) { 
    array[i].state = null; 
    array[i+1].state = 'active'; 
} 
+0

謝謝,這有助於:D – Nalyd

+0

不客氣。如果該代碼適合您,您可以將其標記爲已接受的答案 – user1695032

相關問題