JavaScript:如果在数组中重复找到的值,则返回true的最佳方式

时间:2012-06-05 14:23:18

标签: javascript arrays

  

可能重复:
  Easiest way to find duplicate values in a JavaScript array

假设我有一个包含数千个元素和

的数组

如果 2个或更多具有相同值的元素,我想return true

我知道我可以运行for loop并对每对元素进行检查以找到答案。

但是有更快的方法吗?什么是最好的方式?

7 个答案:

答案 0 :(得分:1)

对它进行排序(无论比较器如何)然后扫描。 O(n log(n))。

答案 1 :(得分:1)

这基本上是Element Distinctness Problem。您可以阅读它,但只有1000个元素,优化可能不值得。

如果您真的想要优化它,可以将元素推送到哈希表中并检查冲突是否重复。这将给你平均O(n)(摊销),但在最坏的情况下给你O(n ^ 2)。

答案 2 :(得分:0)

可能最快的方法是使用本机方法。 inArray不是其中之一。 如果该方法不存在(旧版浏览器),您可以使用indexOf并默认为for循环。

答案 3 :(得分:0)

有一种更快的方法。它的具体实现取决于您在数组中拥有的内容。但这个想法是下面的伪代码:

假设您有一个id(element)函数,它返回元素的字符串标识符。

var map = {};

for(var i = 0; i < myArray.length; i++) {
    var currentId = id(myArray[i]);
    if(map.hasOwnProperty(id)) return true;
    map[id] = true;
}

这里的复杂性是线性的。

如果你没有自然的id,你可以从识别对象的属性中构建一个,或者做一些更聪明的事情......你可以做的最聪明的事情就是重新实现一个hashmap。

答案 4 :(得分:0)

试试这个:

Array.prototype.elementsNotDistinct = function () {
    var i, j, length = this.length - 1;

    for(i = 0; i < length; i++)
        for (j = i + 1; j <= length; j++)
            if (this[i] === this[j]) return true;

    return false;
};

然后,如果你有一个名为a的数组,你需要做的就是:

if (a.elementsNotDistinct()) {
    // do something
}

答案 5 :(得分:0)

我认为Array内置indexOf操作会为您提供出色的工作(取决于您需要排序的数据)

// Filter out all instances that occur twice or more.

var example = [ 1, 2, 3, 3, 3, 5, 4, 3, 5, 3 ];
var result = Array.filter( function ( element ) {
    return this.indexOf( element ) >= 2;
}  
// result is an array of [3,5]

return result.length === 0;

答案 6 :(得分:0)

您可以遍历数组并将对象键设置为等于在数组中找到的元素(以字符串形式转换)。如果您的密钥已经存在,那么您已经在数组中找到了两个具有重复值的元素

function isAllDistinct() {
    var elements  = { },
        yourarray = [...];

    for (i=0, l=yourarray.length; i < l; i++) {
       var key = yourarray[i] + '';  // alternative to yourarray[i].toString()
       if (!elements[key]) {
         elements[key] = 1;
       }
       else {
         return false;
       }
    }
    return true;
}

复杂性:O(n)