2

配列内の重複値を削除する JavaScript 関数を探していました。私はこの機能を見つけました:

function removeDuplicateElement(arrayName)
{
    var newArray=new Array();
    label:for(var i=0; i<arrayName.length;i++ )
    {   
        for(var j=0; j<newArray.length;j++ )
        {
            if(newArray[j]==arrayName[i]) 
            continue label;
        }
        newArray[newArray.length] = arrayName[i];
    }
    return newArray;
}

これは私が必要なものです。この関数が実際にどのように機能するか、また「label:」とは何かを説明してもらえますか? 私はこのコードのロジックを理解できません。誰かが私に説明を与えることができれば、それは素晴らしいことです. 10倍

4

4 に答える 4

3

JavaScript では、 orステートメントlabel:でジャンプ先として aを指定できます。そのため、に達すると、反復は、それが存在する内側のループではなく、外側の for ループに戻ります (これが のデフォルトの動作になります) 。continuebreakcontinuecontinue

基本的に、この関数はnewArray(古い配列を変更するのではなく) 新しい配列を作成し、元の配列のすべての要素をループすることによって機能します。newArrayまだ見つからない場合は、元の配列の要素を追加します。newArray古い配列のループの反復ごとにそれをループし、一致する値を探すことによって、それが既に存在するかどうかを判断しますarrayName[i]

function removeDuplicateElement(arrayName)
{
    // Declares a new array to hold the deduped values
    var newArray=new Array();
    // Loops over the original array
    // label: here defines a point for the continue statement to target
    label:for(var i=0; i<arrayName.length;i++ )
    {   
        // Loops over the new array to see if the current value from the old array
        // already exists here
        for(var j=0; j<newArray.length;j++ )
        {
            // The new array already has the current loop val from the old array
            if(newArray[j]==arrayName[i]) 
            // So it returns to the outer loop taking no further action 
            // This advances the outer loop to its next iteration
            continue label;
        }
        // Otherwise, the current value is added to the new array
        newArray[newArray.length] = arrayName[i];
    }
    // The new deduped array is returned from the function
    return newArray;
}

continueこのコンテキストでの の機能の詳細については、MDN ドキュメント を参照してください

于 2012-11-22T17:47:21.730 に答える
1

この関数は、既存の配列内のすべての要素をループ処理し、それらがまだ新しい配列にない場合は、それらを新しい配列に追加します。はlabel、内側のループがcontinueステートメントを使用して、内側のループの次の反復ではなく、外側のループの次の反復を続行できるようにします。レギュラーcontinueは内側のループを繰り返すだけで、それがとにかく起こります。

于 2012-11-22T17:47:11.320 に答える
0

参考までに、シズルの方法はより高速です。

function dedupe(array) {
    array.sort();
    for(var i = 1; i < array.length; i++) {
        if (array[i-1] == array[i])
            array.splice(i--, 1);
    }

    return array;
}

私は実際にこれを微調整して、jsperf.comで速度を上げることができるかどうかを確認していましたが、これは実際には次のいずれよりも高速です。

function dedupeManyDupes(array) {
    array.sort();
    var l = array.length;
    for(var i = 1; i < l; i++) {
        if (array[i-1] == array[i]) {
            var dupe = array[i];
            var mark = i;
            for(i++; i < l && array[i] == dupe; i++)
            {}
            var snip = i - mark;
            array.splice(mark, snip);
            i -= snip;
            l -= snip;
        }
    }
    return array;
}

http://jsperf.com/js-dedupe-small
http://jsperf.com/js-dedupe-large
http://jsperf.com/js-dedupe-many-dupes

http://jsfiddle.net/b9chris/fLBTv/

于 2013-03-27T06:42:43.353 に答える
0

ES5 メソッドを使用すると、これを少し単純化できます。

function dumpDupes ( arr ) {
    var arr2 = [];
    arr.forEach(function ( item ) {
        if ( arr2.indexOf( item ) === -1 ) arr2.push( item );
    });
    return arr2;
}
于 2012-11-22T18:03:24.687 に答える