2012-08-14 67 views
2

我想遍历对象的数组,并根据某些条件删除其中的一些。如何通过迭代对象数组来删除某些项目?

我使用拼接删除项目,以保持项目的有序计数。

然后每次删除项目我会减少计数。

但由于某些原因它永远不会奏效:

var arr=[{img:1},{img:2},{img:3},{img:4}]; 
for (var i=0, count= arr.length; i < count;) { 
    if (this.arr[i].img==3) { 
     this.arr.splice(i,1); 
     count--; 
    }else i++ 
}; 
alert(JSON.stringify(arr)); 

...任何想法?

+0

我认为['Array.filter'(http://www.tutorialspoint.com/javascript/array_filter.htm)是你所需要的 – mgibsonbr 2012-08-14 01:31:45

+0

我不知道'Array'的事情将在IE8工作。我会仔细看看的。 – Anonymous 2012-08-14 01:32:57

+0

顺便说一句你的方法对我来说工作得很好。唯一的问题是'this.arr'(你是不是只是'arr',因为你用'var'声明了它?) – mgibsonbr 2012-08-14 01:34:46

回答

2

Looping backwards应该做的伎俩。这可避免使用计数器并在由于“退避”值而删除条目时重置计数器。

var i; 
for (i = arr.length; i--;) { 
    if (arr[i].img === 3) { 
     arr.splice(i, 1); 
    } 
}; 
+1

谢谢,我永远不会想到这一点。我认为虽然它应该是'arr.length-1',否则它可能会因为不存在索引而被窃听 – Anonymous 2012-08-14 01:40:39

+2

@Anonymous实际上它很好。 for-loops在执行块之前评估第二部分(条件部分)。所以在一个4的数组中,由于'i - '作为条件,'i'在块开始时变为3。 – Joseph 2012-08-14 01:43:18

+0

这很好。 – Anonymous 2012-08-14 01:48:15

0

我已经处理过这个相同的难度。我的解决方案是循环访问数组,并编写另一个要移除的元素数组。循环遍历元素列表以反向删除并删除它们。这对我很好。

迈克尔G.

0

你指的是this.arr,而不是仅仅arr

从代码中删除两个this.,它的工作原理。 :-)

1

通过数组向后简单的循环,那么你不必调整迭代器:

var i = arr.length; 
while (i--) { 

    if (arr[i].img == 3) { 
    arr.splice(i,1); 
    } 
} 
0

尝试这个循环中,我还没有测试,但应该工作。

var arr=[{img:1},{img:2},{img:3},{img:4}]; 
for (var i=arr.length-1; i >= 0; i--) { 
    if (arr[i].img==3) { 
     arr.splice(i,1); 
    } 
}; 
alert(JSON.stringify(arr));