2011-02-01 33 views
32

如何刪除的項[I]從項目一旦達到:刪除項[I]從jQuery的每個循環

$.each(items, function(i) { 
    // how to remove this from items 
}); 
+4

您的目標是?如果你想從`items`中刪除每個項目,只需將`items`設置爲一個空數組。 – 2011-02-01 23:44:59

+3

什麼是「物品」? – SLaks 2011-02-01 23:46:28

+0

我不必再這麼做了......因爲我不得不重新運行我的javascript函數而沒有意識到實際問題,爲什麼它會在非IE瀏覽器中超時: http://code.google.com/ p/chromium/issues/detail?id = 71305 – bcm 2011-02-02 03:47:07

回答

9

如果你想刪除數組中的元素,使用splice()

var myArray =['a','b','c','d']; 
var indexToRemove = 1; 
// first argument below is the index to remove at, 
//second argument is num of elements to remove 
myArray.splice(indexToRemove , 1); 

myArray現在將包含['a','c','d']

3

喜歡的東西

var indexToBeRemoved = 3; // just an illustration 
$.each(items, function(i) { 
    if(i==indexToBeRemoved){ 
     $(this).remove(); 
    } 
}); 
+2

如果OP想要做的是從DOM中刪除一個元素,那麼這是正確的。如果他想從列表中刪除一個項目,那麼這不會那樣做。 – Pointy 2011-02-01 23:55:53

107

這將是最好不要在這種情況下使用$.each。改爲使用$.grep。除了一個例外,它以與$.each幾乎相同的方式遍歷數組。如果您從回調中返回true,則會保留該元素。否則,它將從數組中移除。

您的代碼應該是這個樣子:

items = $.grep(items, function (el, i) { 
    if (i === 5) { // or whatever 
     return false; 
    } 

    // do your normal code on el 

    return true; // keep the element in the array 
}); 

還要說明一點:this$.grep回調的情況下被設置爲window,而不是數組元素。

10

我猜你想$.map。您可以return null刪除的項目,而不用擔心如何指標可能轉向:

items = $.map(items, function (item, index) { 
    if (index < 10) return null; // Removes the first 10 elements; 
    return item; 
}); 
3

的解決方案是以下:

_.each(data, function (item, queue) { 
    if (somecondition) { 
     delete data[queue] 
    } 
}); 
1

正如@lonesomday上面提到的(我簡直無法添加此在註釋)grep是數組,但你可以裏面grep插入您的選擇:

var items = $.grep($(".myselector", function (el, i) { 
    return (i===5) ? false : true; 
}; 

這將存儲使用發現的所有元素in -Items`在第6位丟棄該項目(該列表爲0索引,這使得第5個元素成爲「5」)

0

雖然我通常更喜歡使用$.grep()來過濾數組,但我有一個實例,已經在陣列上使用$.each()來處理數據集。做一些處理之後,我能確定該項目是否需要從數組中刪除:

// WARNING - DON'T DO THIS: 
$.each(someArray, function(index, item) { 
    // Some logic here, using 'item' 

    if (removeItem) { 
     // Spice this item from the array 
     someArray.splice(index, 1) 
    } 

    // More logic here 
}); 

警告:這提出了一個新的問題!一旦項目與數組拼接起來,jQuery仍然會循環處理原始數組的長度。例如: -

var foo = [1,2,3,4,5]; 

$.each(foo, function(i, item) { 
    console.log(i + ' -- ' + item); 
    if (i == 3){ 
     foo.splice(i, 1); 
    } 
}); 

將輸出:

0 -- 1 
1 -- 2 
2 -- 3 
3 -- 4 
4 -- undefined 

和Foo現在[1, 2, 3, 5]。數組中的每個項目都相對於jQuery循環「移位」,並且我們完全忽略了元素「5」,並且循環中的最後一項是undefined。解決這個問題的方法是使用反向for循環(從arr.length - 10)。 這將確保刪除元素不會影響循環中的下一個項目。然而,由於這裏的問題是,相對於$。每次,有解決這個的一些替代方法:

1)$.grep()前陣循環

var someArray = $.grep(someArray, function(item) { 
    // Some logic here, using 'item' 

    return removeItem == false; 
}); 

$.each(someArray, function(index, item) { 
    // More logic here 
}); 

2)按項目到另一個array

var choiceArray = [ ]; 

$.each(someArray, function(index, item) { 
    // Some logic here, using 'item' 

    if (removeItem) { 
     // break out of this iteration and continue 
     return true; 
    } 

    // More logic here 

    // Push good items into the new array 
    choiceArray.push(item); 
});