我有一组数字,我需要确保它们是唯一的。我在互联网上找到了下面的代码片段,它工作得很好,直到数组中有一个零。我在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数组中删除重复值

类似的问题:

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


当前回答

这是因为0在JavaScript中是一个错误的值。

如果数组的值为0或任何其他错误值,则此[i]将是错误的。

其他回答

对于具有一些唯一id的基于对象的数组,我有一个简单的解决方案,通过它可以对线性复杂性进行排序

function getUniqueArr(arr){
    const mapObj = {};
    arr.forEach(a => { 
       mapObj[a.id] = a
    })
    return Object.values(mapObj);
}

变量数=[1,1,2,3,4,4];函数唯一(dupArray){return dupArray.reduce(函数(上一个,num){if(previous.find(函数(项){返回项==num;})) {返回上一个;}其他{先前推送(num);返回上一个;}}, [])}var check=唯一(数字);console.log(检查);

使用lodash和identity lambda函数执行,只需在使用对象之前定义它

const _ = require('lodash');
...    
_.uniqBy([{a:1,b:2},{a:1,b:2},{a:1,b:3}], v=>v.a.toString()+v.b.toString())
_.uniq([1,2,3,3,'a','a','x'])

并且将具有:

[{a:1,b:2},{a:1,b:3}]
[1,2,3,'a','x']

(这是最简单的方法)

我有一个简单的例子,我们可以从数组中删除对象,

  let data = new Array({id: 1},{id: 2},{id: 3},{id: 1},{id: 3});
  let unique = [];
  let tempArr = [];
  console.log('before', data);
  data.forEach((value, index) => {
    if (unique.indexOf(value.id) === -1) {
      unique.push(value.id);
    } else {
      tempArr.push(index);    
    }
  });
  tempArr.reverse();
  tempArr.forEach(ele => {
    data.splice(ele, 1);
  });
  console.log(data);

如果您使用的是Prototype框架,则无需执行“for”循环,您可以使用http://prototypejs.org/doc/latest/language/Array/prototype/uniq/这样地:

var a = Array.uniq();  

这将产生一个没有重复的重复数组。我在搜索一个方法来计数不同的数组记录时遇到了您的问题,所以在uniq()之后,我使用了size(),得到了一个简单的结果。对不起,如果我打错了

edit:如果您想转义未定义的记录,您可能需要在前面添加compact(),如下所示:

var a = Array.compact().uniq();