ホームページ  >  記事  >  ウェブフロントエンド  >  JS配列から重複を削除する4つの方法

JS配列から重複を削除する4つの方法

大家讲道理
大家讲道理オリジナル
2016-11-10 13:18:111208ブラウズ

フロントエンドの面接官が準備しなければならない質問: Javascript 配列から重複を削除する方法。私の知る限り、Baidu、Tencent、Shanda などはすべてインタビューでこの質問をしています。 この質問は簡単そうに見えますが、実は隠れた危険を含んでいます。 このテストでは、この機能を実装するだけでなく、コンピューター プログラムの実行についての深い理解も問われます。

この目的を達成するために、合計 3 つのアルゴリズムを考え出しました:

Array.prototype.unique1 = function()
{
    var n = []; //一个新的临时数组
    for(var i = 0; i < this.length; i++) //遍历当前数组
    {
        //如果当前数组的第i已经保存进了临时数组,那么跳过,
        //否则把当前项push到临时数组里面
        if (n.indexOf(this[i]) == -1) n.push(this[i]);
    }
    return n;
}
Array.prototype.unique2 = function()
{
    var n = {},r=[]; //n为hash表,r为临时数组
    for(var i = 0; i < this.length; i++) //遍历当前数组
    {
        if (!n[this[i]]) //如果hash表中没有当前项
        {
            n[this[i]] = true; //存入hash表
            r.push(this[i]); //把当前数组的当前项push到临时数组里面
        }
    }
    return r;
}
Array.prototype.unique3 = function()
{
    var n = [this[0]]; //结果数组
    for(var i = 1; i < this.length; i++) //从第二项开始遍历
    {
        //如果当前数组的第i项在当前数组中第一次出现的位置不是i,
        //那么表示第i项是重复的,忽略掉。否则存入结果数组
        if (this.indexOf(this[i]) == i) n.push(this[i]);
    }
    return n;
}

1 番目と 3 番目のメソッドは両方とも配列の IndexOf メソッドを使用します。このメソッドの目的は、配列内で最初に出現する格納されたパラメーターを見つけることです。明らかに、このメソッドを実装するとき、JS エンジンはターゲットが見つかるまで配列を走査します。したがって、この関数は多くの時間を無駄にします。 2 番目の方法では、ハッシュ テーブルを使用します。出現箇所を添字の形式でオブジェクトに保存します。添字付き参照は、indexOf を使用して配列を検索するよりもはるかに高速です。

これら 3 つの方法の効率を判断するために、長さ 10,000 の乱数の配列を生成するテスト プログラムを作成し、いくつかの方法を使用して実行時間をテストしました。 結果は、2 番目の方法が他の 2 つの方法よりもはるかに高速であることを示しています。 ただし、メモリ使用量の観点からは、追加のハッシュ テーブルがあるため、2 番目の方法が使用される可能性が高くなります。これが時間の空間と呼ばれるものです。こちらはテストページですので、ぜひチェックしてみてください。

Array.prototype.unique4 = function()
{
    this.sort();
    var re=[this[0]];
    for(var i = 1; i < this.length; i++)
    {
        if( this[i] !== re[re.length-1])
        {
            re.push(this[i]);
        }
    }
    return re;
}

このメソッドの考え方は、まず配列を並べ替えてから、2 つの隣接する値を比較することです。 ソート時には JS ネイティブ ソート メソッドが使用されます。JS エンジンは内部でクイック ソートを使用する必要があります。 最終的なテスト結果では、このメソッドの実行時間は平均して 2 番目のメソッドの約 3 倍ですが、1 番目と 3 番目のメソッドよりもはるかに高速です。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。