在Javascript中,我如何检查数组是否有重复的值?

2022-08-30 04:24:41

可能的重复:
在javascript数组中查找重复值的最简单方法

如何检查数组是否有重复值?

如果数组中的某些元素相同,则返回 true。否则,返回 false。

['hello','goodbye','hey'] //return false because no duplicates exist
['hello','goodbye','hello'] // return true because duplicates exist

请注意,我不在乎找到重复项,只想要布尔值结果数组是否包含重复项。


答案 1

如果你有一个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;
}

我们使用一个“哈希表”,其键是到目前为止我们在数组中看到的值。我们进行查找,以查看是否已发现该值;如果是这样,我们将退出循环并返回。valuesSoFarintrue


如果您需要一个不仅适用于字符串值的函数,则以下内容将起作用,但性能不高;它是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) 查找时间。valuesSoFarinindexOf


答案 2

您可以使用 SET 删除重复项并进行比较,如果将数组复制到集合中,它将删除所有重复项。然后只需将数组的长度与集合的大小进行比较即可。

function hasDuplicates(a) {

  const noDups = new Set(a);

  return a.length !== noDups.size;
}