39

配列に重複する値が含まれているかどうかをチェックする JavaScript 関数を書きたかったのです。

私は次のコードを書きましたが、その答えは常に「真」です。

何が欠けているのか誰か教えてください。

function checkIfArrayIsUnique(myArray) 
    {
        for (var i = 0; i < myArray.length; i++) 
        {
            for (var j = 0; j < myArray.length; j++) 
            {
                if (i != j) 
                {
                    if (myArray[i] == myArray[j]) 
                    {
                        return true; // means there are duplicate values
                    }
                }
            }
        }
        return false; // means there are no duplicate values.
    }
4

17 に答える 17

23

これは、1 つのループでのみ機能するはずです。

function checkIfArrayIsUnique(arr) {
    var map = {}, i, size;

    for (i = 0, size = arr.length; i < size; i++){
        if (map[arr[i]]){
            return false;
        }

        map[arr[i]] = true;
    }

    return true;
}
于 2013-10-29T10:51:45.347 に答える
19

戻り値を間違った方法で取得しました:

  • 等しい 2 つの値を見つけるとすぐに、配列が一意ではないfalseと結論付けて、 を返すことができます。

  • 最後に、すべてのペアを確認したら、 を返すことができますtrue

これを頻繁に行い、配列が大きい場合は、配列を並べ替えて、隣接する要素のみを比較する可能性を調査することをお勧めします。これにより、現在の方法よりも漸近的な複雑さが向上します。

于 2013-10-29T10:49:14.373 に答える
7

IE8 以外のブラウザをターゲットにしていると仮定すると、

これも同様に機能します:

function checkIfArrayIsUnique(myArray) 
{
    for (var i = 0; i < myArray.length; i++) 
    {
        if (myArray.indexOf(myArray[i]) !== myArray.lastIndexOf(myArray[i])) { 
            return false; 
        } 
    } 
    return true;   // this means not unique
}
于 2013-10-29T10:53:58.847 に答える
2

O(n) ソリューションは次のとおりです。

function hasDupes(arr) {
  /* temporary object */
  var uniqOb = {};
  /* create object attribute with name=value in array, this will not keep dupes*/
  for (var i in arr)
    uniqOb[arr[i]] = "";
  /* if object's attributes match array, then no dupes! */
  if (arr.length == Object.keys(uniqOb).length)
    alert('NO dupes');
  else
    alert('HAS dupes');


}
var arr = ["1/1/2016", "1/1/2016", "2/1/2016"];
hasDupes(arr);

https://jsfiddle.net/7kkgy1j3/

于 2016-01-06T20:18:19.007 に答える
0

コードは問題なく動作しますが、2 行で変更する必要があるだけです。Ture が返された場合、それは指定された配列が Unique であることを意味し、それ以外の場合は Unique ではありません。

function checkIfArrayIsUnique(myArray) 
    {
        for (var i = 0; i < myArray.length; i++) 
        {
            for (var j = 0; j < myArray.length; j++) 
            {
                if (i != j) 
                {
                    if (myArray[i] == myArray[j]) 
                    {
                        return false; // means there are duplicate values(change 1)
                    }
                }
            }
        }
        return true; // means there are no duplicate values.(change 2)
    }
于 2021-07-04T14:07:22.640 に答える