我有几百个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) {
有人能告诉我这里的错误吗?
答案 0 :(得分:6)
因为收集的长度会改变,所以诀窍是从后面循环到前面
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);
};
}
答案 1 :(得分:1)
在迭代数组时,不应更改数组的长度。
您要做的是过滤,并且有一个特定的功能。例如:
[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.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<L.length; rp++) {
if (... i want to keep L[x] ...) {
L[wp++] = L[rp];
}
}
L.splice(wp);
一次从一个数组中删除元素是一个O(n**2)
操作(因为对于你删除的每个元素,所有下面的元素都必须在一个地方滑动),而读写方法则是{{1 }}