如果你有一个ES2015环境(在撰写本文时:io.js,IE11,Chrome,Firefox,WebKit nightly),那么以下内容将起作用,并且速度很快(即O(n)):
function hasDuplicates(array) {
return (new Set(array)).size !== array.length;
}
如果数组中只需要字符串值,则以下方法将起作用:
function hasDuplicates(array) {
var valuesSoFar = Object.create(null);
for (var i = 0; i < array.length; ++i) {
var value = array[i];
if (value in valuesSoFar) {
return true;
}
valuesSoFar[value] = true;
}
return false;
}
我们使用一个“哈希表”,其键是到目前为止我们在数组中看到的值。我们进行查找,以查看是否已发现该值;如果是这样,我们将退出循环并返回。valuesSoFar
in
true
如果您需要一个不仅适用于字符串值的函数,则以下内容将起作用,但性能不高;它是O(n2)而不是O(n)。
function hasDuplicates(array) {
var valuesSoFar = [];
for (var i = 0; i < array.length; ++i) {
var value = array[i];
if (valuesSoFar.indexOf(value) !== -1) {
return true;
}
valuesSoFar.push(value);
}
return false;
}
区别很简单,我们使用数组而不是哈希表,因为JavaScript“哈希表”(即对象)只有字符串键。这意味着我们丢失了 的 O(1) 查找时间,而是获得了 的 O(n) 查找时间。valuesSoFar
in
indexOf