获取数组中的所有唯一值(删除重复项)

我有一系列数字,我需要确保它们是唯一的。 我在互联网上找到了下面的代码片段,它在数组中有一个零之前工作得很好。 我在SO上发现了这个其他脚本,看起来几乎完全一样,但它不会失败。

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

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;
}

重复问题的更多答案:

  • 从JavaScript数组中删除重复项
  • 类似的问题:

  • 在一个数组中获得所有具有多个出现的值(即:不唯一)

  • 使用JavaScript 1.6 / ECMAScript 5,您可以通过以下方式使用Array的本机filter方法来获取具有唯一值的数组:

    function onlyUnique(value, index, self) { 
        return self.indexOf(value) === index;
    }
    
    // usage example:
    var a = ['a', 1, 'a', 2, '1'];
    var unique = a.filter( onlyUnique ); // returns ['a', 1, 2, '1']
    

    本地方法filter将循环访问数组,并只保留那些通过给定回调函数onlyUnique

    onlyUnique检查,如果给定的值是第一次发生。 如果不是,它必须是重复的,不会被复制。

    这个解决方案没有任何额外的库,如jQuery或prototype.js。

    它也适用于具有混合值类型的数组。

    对于不支持本机方法filterindexOf旧浏览器(<ie9),您可以在MDN文档中找到适用于filterindexOf变通办法。

    如果你想保持一个值的最后一次出现,简单地用lastIndexOf替换indexOf

    有了ES6,它可以缩短为:

    // usage example:
    var myArray = ['a', 1, 'a', 2, '1'];
    var unique = myArray.filter((v, i, a) => a.indexOf(v) === i); 
    
    // unique is ['a', 1, 2, '1']
    

    感谢Camilo Martin提供的意见。

    ES6有一个本地对象Set为存储唯一值。 要获得具有唯一值的数组,现在可以这样做:

    var myArray = ['a', 1, 'a', 2, '1'];
    
    let unique = [...new Set(myArray)]; 
    
    // unique is ['a', 1, 2, '1']
    

    的构造函数Set需要一个迭代的对象,如Array和传播运营商...变换设定回一个数组。 感谢Lukas Liese提出的意见。


    更新了ES6 / ES2015的答案 :使用Set,单线解决方案是:

    var items = [4,5,4,6,3,4,5,2,23,1,4,4,4]
    var uniqueItems = Array.from(new Set(items))
    

    哪个返回

    [4, 5, 6, 3, 2, 23, 1]
    

    正如le_m建议的那样,这也可以使用扩展运算符来缩短,如

    var uniqueItems = [...new Set(items)]
    

    你也可以使用underscore.js。

    console.log(_.uniq([1, 2, 1, 3, 1, 4]));
    <script src="http://underscorejs.org/underscore-min.js"></script>
    链接地址: http://www.djcxy.com/p/19035.html

    上一篇: Get all unique values in an array (remove duplicates)

    下一篇: remove array value after index