我有一组数字,我需要确保它们是唯一的。我在互联网上找到了下面的代码片段,它工作得很好,直到数组中有一个零。我在Stack Overflow上找到了另一个脚本,看起来几乎与它完全一样,但它不会失败。

所以为了帮助我学习,有人能帮我确定原型脚本哪里出错吗?

Array.prototype.getUnique = function() {
 var o = {}, a = [], i, e;
 for (i = 0; e = this[i]; i++) {o[e] = 1};
 for (e in o) {a.push (e)};
 return a;
}

重复问题的更多答案:

从JS数组中删除重复值

类似的问题:

获取数组中的所有非唯一值(即:重复/多次出现)


当前回答

我查看了Joeytje50在jsperf上的代码,他比较了许多替代方案。他的代码有很多小错误,这对性能和正确性产生了影响。

更重要的是,他正在一个非常小的阵列上进行测试。我用1000个整数组成了一个数组。每个整数是0到1000之间的随机整数的100倍。这使得平均约1000/e=368个重复。结果在jsperf。

这是一个可能需要效率的更现实的场景。这些变化使声明发生了戏剧性的变化(特别是被吹捧为最快的代码远没有快到哪里去)。明显的赢家是使用哈希技术的地方,最好的是

Array.prototype.getUnique3 = function(){
   var u = Object.create(null), a = [];
   for(var i = 0, l = this.length; i < l; ++i){
      if(this[i] in u) continue;
      a.push(this[i]);
      u[this[i]] = 1;
   }
   return a.length;
}

其他回答

如果只想获取唯一元素并删除重复一次的元素,可以执行以下操作:

设数组=[2,3,4,1,2,8,1,1,5,9,3,5,3,3,8,4];函数removeDucplicates(inputArray){让输出=[];让countObject={};for(数组的值){countObject[value]=(countObject[value]||0)+1;}for(countObject中的键){if(countObject[key]==1){output.push(按键);}}返回输出;}console.log(removeDucplicates(数组));

这个原型getUnique并不完全正确,因为如果我有一个类似于[“1”,1,2,3,4,1,“foo”]的数组,它将返回[“1“,“2”,“3”,“4”],“1”是字符串,1是整数;它们是不同的。

以下是正确的解决方案:

Array.prototype.unique = function(a){
    return function(){ return this.filter(a) }
}(function(a,b,c){ return c.indexOf(a,b+1) < 0 });

使用:

var foo;
foo = ["1",1,2,3,4,1,"foo"];
foo.unique();

以上将产生[“1”,2,3,4,1,“foo”]。

使用字段[2]作为Id,创建唯一数组数组:

常量arr=[['497','Q0','WTX091-B06-138','0','1.000000','GROUP001'],['497','Q0','WTX091-B09-92','1','0.866899288','GROUP001'],['497','Q0','WTX091-B09-92','2','0.846036819','GROUP001'],['497','Q0','WTX091-B09-57','3','0.835025326','GROUP001'],['497','Q0','WTX091-B43-79','4','0.765068215','GROUP001'],['497','Q0','WTX091-B43-56','5','0.764211464','GROUP001'],['497','Q0','WTX091-B44-448','6','0.761701704','GROUP001'],['497','Q0','WTX091-B44-12','7','0.761701704','GROUP001'],['497','Q0','WTX091-B49-128','8','0.747434800','GROUP001'],['497','Q0','WTX091-B18-17','9','0.746724770','GROUP001'],['497','Q0','WTX091-B19-374','10','0.733379549','GROUP001'],['497','Q0','WTX091-B19-344','11','0.731421782','GROUP001'],['497','Q0','WTX091-B09-92','12','0.726450470','GROUP001'],['497','Q0','WTX091-B19-174','13','0.712757036','GROUP001']];arr.filter((val1,idx1,arr)=>~val1.indexOf(val1[2])&&!(arr.filter((val2,idx2)=>~val2.indexOf(val1[2])&&idx2<idx1).长度));控制台日志(arr);

一个简单的代码如下:

let arr = [1,'k',12,1,1,'k','12'];
let distictArr=arr.filter((item, index, arr) => arr.indexOf(item) === index);

console.log(distictArr); // [1, 'k', 12, '12']

我有一个解决方案,它使用es6 reduce和find数组助手方法来删除重复项。

设数=[2,2,3,3,5,6,6];const removeDups=数组=>{return array.reduce((acc,inc)=>{如果(!acc.find(i=>i===inc)){acc.push(包括);}返回acc;}, []);}console.log(removeDups(数字));///[2,3,5,6]