Array.prototype.splice()在迭代时不删除对象

时间:2016-04-18 09:59:54

标签: javascript arrays loops

我正在使用一组mongodbObjectID个对象。我必须检查这个数组是否包含重复项,如果是,请删除它们。

这是我拥有的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 ]

我做错了什么?

2 个答案:

答案 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);