1. 程式人生 > >迴圈陣列刪除某一類時無法遍歷的錯誤修正

迴圈陣列刪除某一類時無法遍歷的錯誤修正

$.each(self.items(), function (i, v) { 
                if(v.businessses){
                    $.each(v.businesses, function (j,item ) {
                        if(item){
                            if(!item.selected()){
                                self.items()[i].businesses.splice(j,1);
                            }
                        }
                    });
                };
            });

刪除滿足具有selected(false)的項,此遍歷因為在遍歷過程中刪除會改變陣列length而漏掉處理後半部分的項

for(var i = self.items().length -1; i >= 0 ; i--){
                if(self.items()[i].businesses){
                    for(var j = self.items()[i].businesses.length -1; j >= 0 ; j--){
                        if(self.items()[i].businesses[j]){
                            if(!self.items()[i].businesses[j].selected()){
                                self.items()[i].businesses.splice(j,1);
                            }
                        }    
                    }
                };
            }

這種方法可以實現

 

(網上轉載)簡化版:一個簡單的需求是,在遍歷一個數組時,移除指定的項。 
下列程式碼是不能正常工作的:

var elements = [1, 5, 5, 3, 5, 2, 4];
for(var i = 0; i < elements.length; i++){
    if(elements[i] == 5){
        elements.splice(i, 1);
    }
}

不能正常執行的問題是,element.length是在for迴圈開始時就確定的snapshot,不會隨著splice操作而改變。

正確的寫法是:

var elements = [1, 5, 5, 3, 5, 2, 4];
for(var i = elements.length -1; i >= 0 ; i--){
    if(elements[i] == 5){
        elements.splice(i, 1);
    }
}