JavaScript配列は重いいくつかの方法に行きます.

2926 ワード

この古い問題はネット上で普通にあります.なぜもう一度書くのですか?主にメモを取るためです.
検索結果配列
考えがはっきりしています.次の通りです.
  • 新しい配列保存結果
  • は、元の配列を巡回し、各要素について結果の配列内で
  • が存在するかどうかを検索する.
  • 存在しない場合は結果配列に保存され、ループが終了するまで第二のステップに戻ります.
    コードが使えなくなりました.ネットで大きなサイズです.
    これは最も直接的な方法であるが,入れ子が循環しているため,効率が高くない.
    並べ替え後の比較
  • は、最初に元の配列を並べ替える
  • .
  • 新しい結果配列
  • は、順序付けされた配列を巡回し、第iの要素と結果配列の最後の要素が等しいかどうかを比較する
  • .
  • 等しい場合は結果配列
  • に預け入れます.
    コードが合わない
    速度は速いですが、順序付けされた配列を返します.もっと早い方法があります.
    オブジェクトを使って既存の要素を記録します.
    この方法はhashtable構造を使用して,ループネストを回避し,また戻る配列順序は変化せず,効率も高い.
    主な考え方は、元の配列の要素を対象とした属性の名来記録が現れたかどうかです.
  • 新しいオブジェクトと結果配列
  • は、元の配列を巡回し、i番目の要素に対して、オブジェクト内の属性名iの属性
  • にアクセスする.
  • 属性が存在しない場合は、この属性はtrueとしてマークされ、この要素を結果配列に保存して、ループが終了するまで2番目のステップを返します.
    ただし、オブジェクトの属性名は、訪問時に文字列に変換されるので、数値0と文字'0'など、異なる種類の値が重くなります.
    解決方法:hashtableのマークtrueを、出現したタイプの配列を保存するように変更し、要素が現れているかどうかを判断する際に、一歩保存したタイプの配列にこのタイプが現れているかどうかを判断してください.
    Array.prototype.unique = function()  
    {  
        var n = {}, r = [], len = this.length, val, type;  
        for (var i = 0; i < this.length; i++) {  
            val = this[i]; //    
            type = typeof val;  //       
            if (!n[val]) {  //      
                n[val] = [type];  //    
                r.push(val);  //         
            } else if (n[val].indexOf(type) < 0) { //     ,             ,     
                n[val].push(type);  //            
                r.push(val);  //         
            }  
        }  
        return r;  
    }
    この方法は効率が高く、返ってくる配列要素の順序は変わりません.
    ES 6
    ES 6の多くの新しい特性が目の前を明るくします.最近はチェットワン峰先生のECMAScript 6入門を読みました.またピカに新しい配列を作って重い方法に行きました.
    つまり、拡張演算子(...)とSetデータ構造の重複しない特性を利用して、配列へのデ重量を達成することです.
    Array.prototype.unique = function(){
      return [...new Set(this)];
    };
    一行のコードで、簡潔です.
    参照
  • js配列の重い4つの方法と以下のコメント
  • 高能率除去js配列中の重複項-柔城-ブログ園
  • SetとMapデータ構造-ECMAScript 6入門