从Javascript数组删除多个对象中断

我有几百个JSON对象的数组……

var self.collection = [Object, Object, Object, Object, Object, Object…] 

每个看起来像这样……

 0: Object id: "25093712" name: "John Haberstich" 

我正在迭代搜索每个Array.id的数组,看它是否匹配第二个数组中的任何ID …

  var fbContactIDs = ["1072980313", "2502342", "2509374", "2524864", "2531941"] $.each(self.collection, function(index, k) { if (fbContactIDs.indexOf(k.id) > -1) { self.collection.splice(index, 1); }; }); 

但是,此代码仅用于从self.collection数组中拼接三个对象,然后它会中断并给出以下错误:

 Uncaught TypeError: Cannot read property 'id' of undefined 

导致错误的行是这一行……

 if (fbContactIDs.indexOf(k.id) > -1) { 

谁能告诉我这里我错了什么?

因为收集的长度会改变,所以诀窍是从后向后循环

 for (var index = self.collection.length - 1; index >= 0; index--) { k = self.collection[index]; if (fbContactIDs.indexOf(k.id) > -1) { self.collection.splice(index, 1); }; } 

迭代时,不应更改数组的长度。

你要做的就是过滤,并且有一个特定的function。 例如:

 [1,2,3,4,5,6,7,8,9,10].filter(function(x){ return (x&1) == 0; }) 

只返回偶数。

在您的情况下,解决方案可以简单地是:

 self.collection = self.collection.filter(function(k){ return fbContactIDs.indexOf(k.id) > -1; }); 

或者,如果其他人保留对self.collection的引用, self.collection需要在其中进行self.collection

 self.collection.splice(0, self.collection.length, self.collection.filter(function(k){ return fbContactIDs.indexOf(k.id) > -1; })); 

如果出于某种原因,您希望一次处理一个元素而不是使用filter ,那么您需要在现场执行此操作,一个简单的方法是读写一个:

 var wp = 0; // Write ptr for (var rp=0; rp 

从一个数组中一次删除一个元素是一个O(n**2)操作(因为对于每个元素你也删除所有以下的元素必须在一个地方滑动),读写方法是O(n)