我正在使用一组mongodb
个ObjectID
个对象。我必须检查这个数组是否包含重复项,如果是,请删除它们。
这是我拥有的removeDuplicate
函数,它只是在一个带有两个索引的数组上循环。如果两个对象相同,则splice()
函数将删除其中一个。
function removeDuplicates(array) {
var a = array.concat(); // Copy object
for(var i=0; i<a.length; ++i) {
for(var j=i+1; j<a.length; ++j) {
console.log(a[i] + " vs " + a[j]);
if(a[i].equals(a[j]))
console.log("removed : " + a.splice(j--, 1));
}
}
return a;
}
我们假设我有一个简单的数组,其中包含两个相同的ObjectID
个对象。
然后我调用removeDuplicates
函数,传递数组。
最后,我打印出阵列本身。
var array = [];
array.push(new ObjectID("56fc227026aed8e74a699b20"));
array.push(new ObjectID("56fc227026aed8e74a699b20"));
removeDuplicates(array);
console.log(array);
这是输出。如您所见,最后没有删除任何内容。
56fc227026aed8e74a699b20 vs 56fc227026aed8e74a699b20
removed : 56fc227026aed8e74a699b20
[ 56fc227026aed8e74a699b20, 56fc227026aed8e74a699b20 ]
我做错了什么?
答案 0 :(得分:3)
您要将其从副本中删除,而不是原件。但是,您似乎正在记录原始文件,因此仍然会包含重复文件。
答案 1 :(得分:1)
反复拼接数组并不是一个好方法,因为它必须分配每个splice新内存,并将结果复制到新内存。然后它必须GC旧的内存
但你可以一步到位;
如何采用不同的方法:
//an utility to be used as a filter:
function removeDuplicates(v, i, arr) {
while(i--) if( v.equals( arr[i] ) ) return false;
return true;
}
var filteredArray = yourArray.filter(removeDuplicates);