2010-11-17 70 views
1

當輸入的for循環,它從不停止:什麼導致我的javascript for語句中的無限循環?

remove: function remove(e) { 
    var objectToRemoveId = e.currentTarget.getAttribute('objectId').toString(); 
    var filteredList = this.myDto.objectList; 

    for (var index = 0; index < this.myDto.objectList.length; index++) { 
      var currentObject = this.myDto.objectList[index]; 

     if (currentObject.Id !== objectToRemoveId) { 
     filteredList[filteredList.length + 1] = timeSheet; 
     } 
    } 
    } 

假定this.myDto.ObjectList是在它的一個元件的陣列。我敢肯定,問題只是盯着我,但我無法弄清楚。

+0

您可以嘗試在'for'循環的開始處設置一個帶'index'變量值的alert語句 – 2010-11-17 16:17:54

回答

9

您正在添加到您的循環中的同一個列表,所以每次循環時,您的this.myDto.objectList.length都會增加一個。好像你希望空數組這裏:

var filteredList = this.myDto.objectList; 

像這樣:

var filteredList = []; 

或複印件,這樣的:

var filteredList = this.myDto.objectList.slice(); 

我不知道到底結果是應該是,添加到一個名爲filtered的列表正在拋棄我,但無論哪種情況,您都可能在上面的解決方案之一之後。

+0

@chum - 我不確定*完全是*後面的內容,但是要克隆它將是:'var filteredList = this.myDto.objectList.slice();' – 2010-11-17 16:17:20

+0

糟糕,並不意味着刪除我的評論,只是編輯它。我的意思是創建一個與我的objectList大小相同的數組,並且我正在做一個大腦放屁。var filteredList = [];工作也一樣,我一直忘記,在JavaScript中你不必聲明一個數組長度。 – 2010-11-17 16:21:19

0

這是因爲你正在修改你迭代的列表,每次迭代增加它的長度,因此索引總是比數組的長度小1。

的混亂可能是因爲參考:

var filteredList = this.myDto.objectList; 

但是你仍然在使用的循環,這可能是爲什麼你沒有發現它的this.myDto.objectList參考。

0

難道你不能這樣做,以減少混淆?

remove: function remove(e) { 
    var objectToRemoveId = e.currentTarget.getAttribute('objectId').toString(); 
    var filteredList = new Array(); 

    for (var index = 0; index < this.myDto.objectList.length; index++) { 
      var currentObject = this.myDto.objectList[index]; 

     if (currentObject.Id !== objectToRemoveId) { 
     filteredList[index] = timeSheet; 
     } 
    } 
    } 
0

有兩個錯誤,它們一起使所述無限循環:

  1. filteredListthis.myDto.objectList基準 - 這兩個變量是指相同的對象。當你追加增加filteredList的長度時,你也增加了myDto.objectList的長度。這部分問題的解決方案是使用.slice()方法來複制數組。

  2. 此外,您正在使用嚴格比較運算符(!==)來查找您的objectToRemoveId。由於id很可能以數值形式存儲,並且您在屬性上調用.toString(),所以這些值可以不相等,因此每次通過循環時都會陷入if語句。

將兩者放在一起,並且在循環遍歷數組時,最終會在每次迭代中向數組中添加一個項。