1. ホーム
  2. javascript

[解決済み] Javascriptで、配列の値が重複しているかどうかを確認するにはどうすればよいですか?

2022-08-22 21:05:15

質問

重複している可能性があります。

javascriptの配列で重複する値を見つける最も簡単な方法

配列に重複する値があるかどうかを確認するにはどうすればよいですか?

配列の一部の要素が同じであれば、trueを返します。そうでなければ、falseを返します。

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

私は重複を見つけることには関心がなく、配列が重複を含むかどうかのブール値の結果が欲しいだけであることに注意してください。

どのように解決するのですか?

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 .


文字列以外の値に対しても機能する関数が必要な場合は、次のようにすれば動作しますが、性能はそれほど高くありません。 2 ) です。

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

のハッシュテーブルの代わりに配列を使っているだけの違いです。 valuesSoFar JavaScriptのハッシュテーブル(つまりオブジェクト)は文字列のキーしか持っていないからです。つまり、O(1) のルックアップ時間を失った in のルックアップ時間を失い、代わりに O(n) のルックアップ時間を持つ indexOf .