アレイ操作を実行するとき、多くの場合、重複を削除するという問題に遭遇します。以下は、アレイの重複排除方法の簡単な紹介です。
重複排除の指標
array.prototype.unique1 = function(){var arr = []; for(var i = 0; i <this.length; i ++){var item = this [i]; if(arr.indexof(item)=== -1){arr.push(item);}}} return return return arr;} [1,2,3、 '4'、3,4,3,1、'34 '、2] .unique1(); // [1、2、3、 "4"、4、 "34"]]ただし、IE6-8では、アレイのインデックスメソッドはまだ存在していません(これは少し古いトピックo(∩_∩)o〜)ですが、プログラマーはメソッドのインデックスを記述する必要があります。
var indexof = [] .indexof? function(arr、item){return arr.indexof(item);}:function indexof(arr、item){for(var i = 0; i <arr.length; i ++){if(arr [i] === item){return i;}} return -1;} array.protototototy.unique2 = functions(){var arr = air ^ for []; {var item = this [i]; if(arr.indexof(item)=== -1){arr.push(item);}} return arr;} [1,2,3、 '4'、3,4,3,1、'34 '、2] .unique2(); // [1、2、3、 "4"、4、 "34"]]IndexOFは、この再構築方法を使用することもできます。
array.prototype.unique3 = function(){var arr = [this [0]]; for(var i = 1; i <this.length; i ++){if(this.indexof(this [i])== i){arr.push(this [i]);}} return arr;} [4 '、3,4,3,1、'34'、2] .unique3(); // [1、2、3、 "4"、4、 "34"]]リロードするハッシュ
上記のインデックスは正しいですが、パフォーマンスの観点からは、ダブルサイクルがパフォーマンスを低下させます。次に、ハッシュを使用します。
array.prototype.unique4 = function(){var arr = []; var hash = {}; for(var i = 0; i <this.length; i ++){var item = this [i]; var key = typeof(item)+itemif(hash [key]!== 1){arr.push); arr;} [1,2,3、 '4'、3,4,3,1、'34 '、2] .unique4(); // [1、2、3、 "4"、4、 "34"]]コアは、インデックスを置き換えるためにハッシュオブジェクトを構築することです。空間を時間に変更します。 JavaScriptでは、オブジェクトのキー値は文字列のみになります(もちろん、ES6はマップデータ構造を提供します。オブジェクトに似ており、キー価値のペアのコレクションでもありますが、「キー」の範囲は文字列に限定されませんが、あらゆる種類の値(オブジェクトを含む)はキーと見なすことができます。より完全なハッシュ構造表現。)、var key = typeof(item) +アイテムは、値1と文字列「1」を区別するために必要です。
次に、「4」と4を同じと見なしたい場合(他のアプローチは同じです)
array.prototype.unique5 = function(){var arr = []; var hash = {}; for(var i = 0、len = this.length; i <len; i ++){if(!hash [i]]){arr.push(this [i]); arr;} [1,2,3、 '4'、3,4,3,1、'34 '、2] .unique5(); // [1、2、3、 "4"、 "34"]並べ替え後、繰り返し
array.prototype.unique6 = function(){this.sort(); var arr = [this [0]]; for(var i = 1; i <this.length; i ++){if(this [i]!== arr [arr.length-1]){arr.push(this [i]);}} arr;} [1,2,3、 '4'、3,4,3,1、'34 '、2] .unique6(); // [1、2、3、 "34"、 "4"、4]最初に配列を並べ替え、次に2つの隣接する値を比較します。ソートするときは、JSネイティブソートメソッドを使用して、非常に高速です。この方法には1つの欠点しかありません。文字を比較するとき、それらは文字エンコードの順序でソートされます。したがって、10は2で最初にランクされていることがわかります。ただし、重量の除去に影響しません。ただし、ある種の問題を解決するために、ソートメソッドはパラメーターを受け入れます。これは方法です。
function compare(value1、value2){if(value1 <value2){return -1;} else if(value1> value2){return 1;} els {return 0;}} [1,2,5,2,10,3,20] .sort(compare); // [1、2、2、3、5、10、20]リロードするように設定
ES6は新しいデータ構造セットを提供します。それは配列に似ていますが、メンバーの値はすべて一意であり、複製値はありません。ブラウザが完全にサポートされ、サーバーノードもサポートされています。
array.prototype.unique7 = function(){return array.from(new set(this));} [1,2,3、 '4'、3,4,3,1、'34 '、2] .unique7(); // [1、2、3、 "4"、4、 "34"]]メソッドライブラリ
ノードまたはブラウザJSで非常に人気のあるメソッドライブラリEnderscore.jsを推奨しました。
const _ = require( 'Underscore'); _。uniq([1、2、1、3、1、4]); // [1、2、3、4]
テスト時間
上記のすべての方法は簡単な方法でテストし、最適な方法を比較して選択できます。
Console.Time( "Test"); [1,2,3、 '4'、3,4,3,1、'34 '、2] .unique7(); Console.TimeEnd( "Test"); ==> VM314:3テスト:0.378ms
データを大きくするには、100万の数字をランダムに作成します。
var arr = []; var num = 0; for(var i = 0; i <1000000; i ++){num = math.floor(math.random()*100); arr.push(num);} console.time( "test"); arr.unique7(); console.timeand( "test");上記は、編集者があなたにゆっくりから中程度から単純に紹介したJavaScriptアレイの重複排除です。私はそれが誰にでも役立つことを願っています。ご質問がある場合は、メッセージを残してください。編集者は、すべての人に時間内に返信します。 wulin.comのウェブサイトへのご支援ありがとうございます!