可能重复:
Easiest way to find duplicate values in a JavaScript array
假设我有一个包含数千个元素和
的数组如果 2个或更多具有相同值的元素,我想return true
。
我知道我可以运行for loop
并对每对元素进行检查以找到答案。
但是有更快的方法吗?什么是最好的方式?
答案 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)