从jQuery每个循环中删除item [i]

时间:2011-02-01 23:43:25

标签: javascript jquery

如果物品到达时,如何从物品中移除物品[i]:

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

7 个答案:

答案 0 :(得分:116)

在这种情况下,最好不要使用$.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,而不是数组元素。

答案 1 :(得分:10)

我猜你想要$.map。您可以return null删除项目,而不必担心索引可能会如何转变:

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

答案 2 :(得分: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 :(得分:4)

解决方案如下:

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

答案 4 :(得分:3)

这样的东西
var indexToBeRemoved = 3; // just an illustration
$.each(items, function(i) {
    if(i==indexToBeRemoved){
        $(this).remove();
    }
});

答案 5 :(得分:1)

如上面的@lonesomday所述(我根本无法在评论中添加此内容){J}适用于数组,但您可以在grep内插入您的选择器:

grep

这会将var items = $.grep($(".myselector", function (el, i) { return (i===5) ? false : true; }; 中使用$(".myselector")找到的所有元素存储在第6个位置的项目中(列表为0索引,这使得“5”成为第6个元素)

答案 6 :(得分: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仍将循环显示原始数组的长度。 E.g:

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 - 1转到0)。  这将确保删除元素不会影响循环中的下一个项目。但是,由于这里的问题是关于$ .each,所以有一些替代方法可以解决这个问题:

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)将项目推送到另一个数组

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);
});