8

重複の可能性:
JavaScript 配列で重複する値を見つける最も簡単な方法

配列で 2 つの値が同じかどうかを調べています。私は次のコードを書きました:

function validatePassTimeFields(passtimes) {
    var success = true; 
    var length = passtimes.length;
    var hashMap = new Object();
    for (var j=0; j<length; j++) {
        if(hashMap[passtimes[j].value]==1) {
            success = false;
            alert("Duplicate Found");
            break;
        }
        hashMap[passtimes[j].value]=1;
    }
    return success;
}

私はJavascriptが初めてなので、HashMapを使って重複があるかどうかを調べてみました。JavaScript で重複を見つける最良の方法はありますか? または私はそれを最適化できますか?

4

4 に答える 4

1

//他の場所で使用する場合にのみ、最適化する必要があります-

function noduplicates(array){
    var next, O= {},
    L= array.length;
    while(L){
        next= array[--L];
        if(O[next]) return false;
        O[next]= 1;
    }
    return true;
}


function validatePassTimeFields(passtimes){
    if (noduplicates(passtimes)) return true;

    alert("Duplicate Found");
    return false;
}
于 2012-10-04T17:58:46.163 に答える
1

あなたの関数は、文字列または数値を含む配列に対してのみ機能するという問題を除けば、すでに非常に優れています。オブジェクトにも注意を払うためのより難しいアプローチについては、この回答を参照してください。value明示的で制限されたユースケース(プロパティによる身元の確認)があるため、それはあなたにとって重要ではないと思います。

ただし、いくつかの点で異なる点があります。

  • success変数をbreakループから使用しないでくださいreturn。関数全体から使用してください。
  • 通常、コンストラクターの代わりにnew Objectショートカット オブジェクト リテラル{}が使用されます。
  • hashMapの値をtoに設定する代わりに、;を1使用できます。等値演算子を省略して、プロパティの真偽を確認trueすることもできます。==私もinoperatorを使用します。
function validatePassTimeFields(passtimes) {
    var length = passtimes.length;
    var hashMap = {};
    for (var j=0; j<length; j++) {
        if (passtimes[j].value in hashMap) {
            alert("Duplicate Found");
            return false;
        }
        hashMap[passtimes[j].value] = 1;
    }
    return true;
}
于 2012-10-04T18:43:51.653 に答える
0

重複があるかどうかを確認するためだけに、重複を見つけたくないようですか?

あなたはかなり近いです、ここに機能する関数があります。

var hasDuplicates = function (arr) {

    var _store = {};

    for (var i = 0; i < arr.length; i++) {

        if (typeof _store["_" + arr[i]] !== "undefined") {
            return true;
        }

        _store["_" + arr[i]] = true;

    }

    return false;

};

連想配列のアンダースコアは、数値を格納するために必要です。このhasDuplicates()関数は、メソッドを持つオブジェクトのみを機能させますtoString()

重複をチェックするには;

var yourArray  = [1, 5, 7, 3, 5, 6];

if (hasDuplicates(yourArray)) {...
于 2012-10-04T17:34:34.210 に答える
0

この機能のアンダースコアの実装をチェックアウトする価値があるかもしれません。重複を排除するだけの場合は_.uniq()を使用できますが、重複があることや純粋な実装の詳細を知りたい場合は、このメソッドのソースをチェックしてみてください。非常にうまく文書化されています。

これは質問に対する直接的なコードの回答ではないことを私は知っています.ここにはすでにいくつかあるので、繰り返すのは役に立ちません. しかし、underscore は優れたユーティリティ ライブラリであり、ソースは適切に作成された JavaScript について学ぶのに最適な場所であるため、言及する価値があると思いました。

于 2012-10-04T17:40:23.787 に答える