以下は部品を複製することが、このプロジェクトは便利な、しかし整理と確認することが心配な方ではありません。
します。https://www.cnblogs.com/jiayuexuan/p/7527055.html
1.反復方法
これは、最も単純な配列の重複排除方法(indexOfメソッド)であります
アイデアの実現:新しい値が配列(のindexOf -1)でない場合、重くなるようにアレイを横断する新しいアレイが新しいアレイに添加しました。
VaRのARR = [2,8,5,0,5,2,6,7,2]。 関数unique1(ARR){ VARハッシュ= []; 用(VAR i = 0; I <arr.length; iは++){ IF(hash.indexOf(ARR [I])== - 1){ hash.push(ARR [I])。 } } ハッシュを返します。 }
2.解析方法アレイ添字
indexOfメソッド、パフォーマンス、ほぼ1をコール
アイデアの実現:私はない現在の配列位置で初めてのアイテムIの現在のアレイは、次にiが繰り返される項目を表す場合、無視。そうでなければ、結果は配列に格納されています。
関数unique2の(ARR){ VARハッシュ= []; 用(VAR i = 0; I <arr.length; iは++){ IF(arr.indexOf(ARR [I])== I){ hash.push(ARR [I])。 } } ハッシュを返します。 }
3.ソート隣接除去方法
アイデアの実現:同じ値が隣接することになる注文後、その後、唯一の新しい配列が以前の値と重ならない追加、並べ替え後の配列を横断し、渡された配列をソートします。
関数unique3(ARR){ arr.sort()。 VARハッシュ= [0] [ARR]。 用(VAR I = 1; I <arr.length; iは++){ IF(ARR [I] =ハッシュ[hash.length-1]!){ hash.push(ARR [I])。 } } ハッシュを返します。 }
4.最適化法(参考)を繰り返します
アイデアの実現:ダブルループは、外側ループは0からarr.lengthを表し、サイクルがarr.lengthにI + 1を表します
新しい配列に正しい値を複製しません。(外側のループは、同じ時間を繰り返したときに、現在のサイクルで検出され、判定の値に終了します)
関数unique4(ARR){ VARハッシュ= []; 用(VAR i = 0; I <arr.length; iは++){ 用(VARのJ = I + 1、J <arr.length; J ++){ IF(ARR [I] === ARR [J]){ + + I; } } hash.push(ARR [I])。 } ハッシュを返します。 }
属性名は重い配列のために行くことができます
unique4関数(ARR、名){ ハッシュ= [] VAR; のための(VARのI = 0;私は<arr.length; Iは++){ {ため(; J <arr.length J ++ VAR =私はJ. + 1) IF( ARR [I] [名] === ARR [J] [名]){ ++ I; } } hash.push(ARR [I] [名]); //他の属性の値を保持したくない加えました[名前] } ハッシュを返します; }
達成5.ES6
基本的な考え方:ES6は、新しいデータ構造のセットを提供します。これは、配列に類似しているが、メンバーの値は、重複する値が一意ではありません。
パラメータとして配列(または配列のようなオブジェクト)を受け入れることができる設定機能は、初期化するために使用されます。
関数unique5(ARR){ VAR X =新しいセット(ARR)。 戻る[... X]; }
拡張:繰り返される場合は、この要素が削除されます
配列の添字の重複除外
関数unique22(ARR){ VARハッシュ= []; 用(VAR i = 0; I <arr.length; iは++){ IF(arr.indexOf(ARR [I])== arr.lastIndexOf([I])ARR){ hash.push(ARR [I])。 } } ハッシュを返します。 }
二つます。https://www.cnblogs.com/wteam-xq/p/4732351.html
1.反復方法
重量に最も簡単な方法は、 アイデアの実現:新しい配列を作成し、横断する渡された配列、値を新しい配列に新しい配列に追加されていません。ポイントに注意を払う:メソッド「のindexOf」方法の配列の値がECMAScript5、IE8以下であるかどうかを判断しますサポートされていない、次のように、ブラウザのコード、ソースコードの低いバージョンとの互換性が記述する必要があります:
最も単純な配列//メソッド重量に対する 機能をunique1(アレイ){ VAR N- = []; //新しい一時配列 //現在の配列反復 のための(VARのI = 0;私は<Array.lengthとすることが、私は++){ //私の現在の配列が一時配列に保存した場合は、スキップ //そうでない場合は、一時的な配列に、現在の用語プッシュの内側 であれば(n.indexOf(配列[i]の [)== -1)n.push(配列をI]); } N-返します; }
//サポートしていないブラウザはindexOfを、indexOfの新しい方法ecmaScript5 IE8以下をサポート(IE8を含むが、IE8は一部のみのecma5をサポートしている)かどうかを判断する IF(!Array.prototype.indexOfを){ // indexOfメソッドを追加します Array.prototype.indexOf =関数(項目){ VAR結果= -1、a_item = NULL; IF(this.length == 0){ ;リターン結果 } {(; IがLEN <I ++はVAR I = 0、LEN = this.length)用 a_itemこの= [I]; IF(a_item ===アイテム){ 結果= I; BREAK; } } 戻り結果; } }
オブジェクトキー2.方法
他の方法よりも実行速度高速化の方法は、メモリの一部を取ることで、アイデアの実現:入ってくる配列を横断しながら、新しいJSオブジェクトと新しい配列は、jsオブジェクトのキーの値が、かどうかを判断するために、新しいオブジェクトのためのケースではありませんキーを高め、新しい配列に入れて。注意事項: オブジェクトがキーJS着信キー「のtoString()」に自動的に実行、別のキーとして誤解することができるされているか否かを決定することと、例えば[1]、[ 「1」]。問題を解決するにはまだ「のindexOf」を呼び出す必要があります。
//最速、空間(時間間隔)がアップ含む unique2の(配列){機能 VAR N- = {}は、R = []においてlen = Array.lengthとすること、ヴァル、タイプ; (VAR I = 0;私は< Array.lengthとすること; Iは++){ ヴァル=配列[I]; TYPE = typeof演算ヴァル; !IF(N- [ヴァル]){ N- [ヴァル] = [タイプ]; r.push(ヴァル); }そうでない場合には(N- [ヴァル] .indexOf(タイプ)<0){ N- [ヴァル] .push(タイプ); r.push(ヴァル); } } 戻りR&LT; }
3.
それでも、ほぼ1で「indexOfの」メソッドパフォーマンス、呼び出す必要がアイデアの実現を:私はない、現在の配列位置で初めてアイテムの現在の配列iの場合は、その後、私は無視され、項目が繰り返される表します。そうでなければ、結果は配列に格納されています。
unique3関数(アレイ){ VAR N- = [配列[0]; //結果のアレイ 秒から横断// ため(VAR 1 = I; Iは<Array.lengthとすること; Iは++){ //現在のアレイ場合私が最初に現在の配列位置に出現した項目は、私ではありません //ので、私は無視され、項目が繰り返される表します。そうでない場合、に得られた配列 IF(Array.indexOf(配列[I])== I)はn.push(配列[I]); } ; N-返します }
4.
「ソート」がネイティブメソッドの配列は、結果が信頼性の低いソートするが、効果なしの再順番に欠点に注意を払っていません。アイデアの実現:横断しながら元の値のみの非繰り返しの新しい配列を結合する、同じ値にソートされた隣接し、並べ替えの配列を渡します。
隣接し、その後、トラバース値の重複排除の//同じ値 関数unique4(アレイ){ のArray.sort(); VAR =再[配列[0]; (VAR 1 = Iため、私は<Array.lengthとすること; I ++ ){ IF(配列[I] ==のRe [-re.length 1。])! { re.push(配列[I]); } } のReを返します; }
最適化法の反復処理
より外国ボーエン、実装コードの方法は非常にクールです。アイデアの実現:新しい配列に右端の値を繰り返さないます。(上部ループが判定値ながら繰り返される入力するとき、現在のサイクルで検出は終了します)
@アイデア:新しい右端の配列に値を重複しない取得 機能unique5(アレイ){ VARのR&LT = []; のため(VAR I = 0、L = Array.lengthとすること; Iは、Lを<; Iは++){ (用= Iは、J 1つのVARを+; J <L; J ++) ;(配列[I] ===配列[J])J = I ++はIF r.push(配列[I]); } 戻りR&LT; }
三つます。https://www.jianshu.com/p/79fe3489600f
方法であっ反復
アイデアを再実現する最も簡単な方法:新しい配列、配列着信トラバーサルを作成し、新しい値は、アレイに新しいアレイに追加されない。点に注意してください。アレイ「のindexOf」の値であるか否かを判定する処理で次のようにIE8ブラウザのコード、ソースコードの低いバージョンとの互換性が記述する必要がサポートされていないECMAScript5方法は、次のとおりです。
var arr = [1,3,5,7,9,1,9,5,9,3,5,11,13]; function unique1(array){ var newArr=[];//新建一个新数组 //遍历参数数组array for(var i=0;i<array.length;i++){ //判断新数组是否有这个元素值,没有的话,就把arr[i]给push到新数组newArr中 if(newArr.indexOf(array[i])===-1){ newArr.push(arr[i]); } } return newArr; } console.log(unique1(arr));
結果は以下の通りであります:
2.法律のためのオブジェクトキー
、ほぼすべての他の方法よりは、アイデアの実現、実行する方法のメモリ速度の多数によって占有されている:配列を横断中に渡された新しいJSのオブジェクトと配列を作成し、それをオブジェクトのjsの値か否かが判断されますキー、そうでない場合は、オブジェクトに追加して、新しい配列に格納するための鍵。注意事項:JSは、対象キーは、自動的に着信キー「のtoString()」、異なるキーはとして誤解されるかもしれを行うか否かを判断する;例えば:[1]、[ 「1」]。問題を解決するには、まだ調整「のindexOf」する必要があります。
var arr = [1,3,5,7,9,1,9,5,9,3,5,11,13]; // 速度最快, 占空间最多(空间换时间) function unique2(array){ var json={},newArr=[],val,type; for(var i=0;i<array.length;i++){ val=array[i]; //判断val是什么数据类型 type=typeof val; console.log("判断类型"+[type]); //判断值是否为js对象的键,不是的话给对象新增该键并放入新数组 if(!json[val]){ json[val]=[type]; newArr.push(val); } else if(json[val].indexOf(type)<0){ json[val].push(type); newArr.push(val); } } return newArr; } console.log(unique2(arr));
結果は以下の通りであります:
3.配列の添字法判事は
まだ、ほとんど1とアイデアの実現を「indexOfの」メソッドのパフォーマンスを呼び出す必要があります:現在の配列現在の配列の最初の出現の私の項目は私ではないので、私はアイテムが重複して表す場合、無視されます。そうでなければ、結果は配列に格納されています。
var arr = [1,3,5,7,9,1,3,5]; function unique3(array){ var n = [array[0]]; //结果数组 //从第二项开始遍历 for(var i = 1; i < array.length; i++) { //如果当前数组的第i项在当前数组中第一次出现的位置不是i, //那么表示第i项是重复的,忽略掉。否则存入结果数组 if (array.indexOf(array[i]) == i) n.push(array[i]); } return n; } console.log(unique3(arr));
結果は以下の通りであります:
4.隣接する除去方法をソート
結果をソート「ソート」は、天然の配列は非常に信頼性の高い方法が、しかし、欠点には影響を重み付けしないために注意を払っていません。アイデアの実現:横断しながら元の値のみの非繰り返しの新しい配列を結合する、同じ値にソートされた隣接し、並べ替えの配列を渡します。
var arr = [1,3,5,7,9,1,3,5]; function unique4(array){ array.sort(); var re=[array[0]]; for(var i = 1; i < array.length; i++){ if( array[i] !== re[re.length-1]){ re.push(array[i]); } } return re; } console.log(unique4(arr));
配列による最適化プロセス
メソッドのコードを達成するためのアイデアを実現するために、かなりクールです:新しい右端の配列に値を重複していない取得します。推奨(検出は上部ループ決意に同時に値と、現在のサイクルが繰り返され、終了します)
// 思路:获取没重复的最右一值放入新数组
var arr = [1,3,5,7,9,1,3,5]; function unique5(array){ var r = []; for(var i = 0, l = array.length; i < l; i++) { for(var j = i + 1; j < l; j++) if (array[i] === array[j]) j = ++i; r.push(array[i]); } return r; } console.log(unique5(arr));
結果は以下の通りであります:
ハッシュ表6.
:アイデアは以下の通りである
ハッシュが存在キーの対象である(キー:値)が、今、[キー] =値ハッシュ空である;
1:I = 0;この[I] =この[0] = 1;ハッシュ[この[0] =ハッシュ[1]、 ハッシュは最初は空であるので、何1 =キー値が見つからなかった、それが定義されていない、
2:ハッシュ[1]真(ケースへ=新しい元の配列、繰り返しステップにオブジェクトの第一のセットのハッシュ値のペアを持っている)、最初の配列の数
:3繰り返されるようにハッシュ値が決意を繰り返さないためには、未定義です真ので繰り返さないが、新しいアレイに追加された
4:ハッシュテーブルの値をヒープメモリのメモリアドレスに格納されているため、素子の非繰り返しの数、店舗ポイントに必要なメモリの数ので、この方法はあまりメモリであるが、対照的に、この運動の動作が最速で、
5:これは少量のデータと引き換えに時間の空間であり、この方法が推奨されます
var arr = [1,'b','b',4,3,3,4,5,1]; Array.prototype.unique2 = function(){ var hash = {}; //定义一个hash表 var arr1 = []; //定义一个新数组 for(var i=0;i<this.length;i++){ if(! hash[this[i]]){ hash[this[i]] = true; arr1.push(this[i]); } } return arr1; } console.log(arr); console.log(arr.unique2());
結果は以下の通りであります: