はしがき
最近、転職と面接の準備のために、JavaScript関連の知識の復習を始めました、昨日の午後、配列重複排除の関連手法を思いついたので、簡単にJavaScriptアルゴリズムの記事をいくつかまとめてみました。このシリーズの記事の将来の使用は不確実であり、期限はなく、思いついたままに書きます、正確性の保証はありません、高い効率性の保証はありません、単なる個人的な理解についての話です、間違いがあれば修正してください。
重複削除について
配列の重複排除はアルゴリズムの一般的な検査ポイントであり、重複排除を達成する方法は一意性と非一意性を介することに他なりません。簡単に言うと、ユニークなものを選び出すか、ユニークでないものを削除するということです。以下のアルゴリズムはすべて私が盲目的に命名したものです。無視してください。
ループマッチングして重複を削除します
名前が示すように、配列内の各要素は、その要素が格納されている配列と比較され、反復しない要素が見つかった場合は、ループの終わりまで新しい配列に入れられます。重複を削除することは、誰もが思いつく最も簡単な方法とも言えます。
実装コード:
var arr=[1,3,4,56,3,7,9,7]; var result=[]; //匹配 function isMatch(array,n){ for(var i=0;i<array.length;i++){ if(array[i]==n){ return true; } } return false; }; //验证所有元素 function unqiue(array){ for(var i=0;i<array.length;i++){ if(!isMatch(result,array[i])){ result.push(array[i]); } } return result; }; console.log(unqiue(arr));
注: 上記の方法には、数字と数値列が存在する場合、数字と数値列が区別されないというバグがあります。マッチング関数 isMatch() では二重等価性「==」が使用されており、要素の型が検証されていないため、実際には一致する「===」を使用する必要があります。
変更されたコードは次のとおりです:
var arr=[1,3,4,56,3,'1',7,9,7]; var result=[]; //匹配 function isMatch(array,n){ for(var i=0;i<array.length;i++){ if(array[i]===n){ return true; } } return false; }; //验证所有元素 function unqiue(array){ for(var i=0;i<array.length;i++){ if(!isMatch(result,array[i])){ result.push(array[i]); } } return result; }; console.log(unqiue(arr));
アルゴリズムの長所と短所:
利点:
シンプルな実装と直感的な思考
欠点:
非効率
JSON 重複排除/オブジェクト重複排除/辞書重複排除
JSON 重複排除とは、簡単に言えば、Object オブジェクト キーの一意性を利用して、配列の要素を JSON またはオブジェクトのキー値に変換することです。 JSON 値には配列のインデックス インデックスが格納され、JSON オブジェクトに対して for in ループが実行され、それが新しい配列に格納されます。
配列、JSON、および {} はすべてオブジェクトであるため、このアルゴリズムはいずれかを使用して実装できます。
実装コード:
配列モード:
var arr=[1,3,4,56,3,'1',7,9,7]; function unqiue(array){ var cache=[]; var result=[]; //将数组元素转为对象的key for(var i=0;i<array.length;i++){ cache[array[i]]=i; }; //存储key(实际的数组元素) for(key in cache){ result.push(key); }; return result; } console.log(unqiue(arr));
JSON モード:
var arr=[1,3,4,56,3,'1',7,9,7]; function unqiue(array){ var cache={}; var result=[]; //将数组元素转为对象的key for(var i=0;i<array.length;i++){ cache[array[i]]=i; }; //存储key(实际的数组元素) for(key in cache){ result.push(key); }; return result; } console.log(unqiue(arr));
オブジェクトモード:
var arr=[1,3,4,56,3,'1',7,9,7]; function unqiue(array){ var cache=new Object(); var result=[]; //将数组元素转为对象的key for(var i=0;i<array.length;i++){ cache[array[i]]=i; }; //存储key(实际的数组元素) for(key in cache){ result.push(key); }; return result; } console.log(unqiue(arr));
アルゴリズムの長所と短所:
利点:
シンプル
非常に効率的です
欠点:
1. 配列要素の型を変更しました ()
2. バグがある (数値と数値文字列の区別以外の何ものでもない)
キューの再帰的重複排除
昨夜ずっと考えて、キューを使うことを考えました。まず配列を昇順または降順でキューに並べて、同じ要素が領域内にあるようにして、最後から一致させます。キューを前方に移動します。一致が成功した場合は、キューの末尾を削除します。その後、前の要素が前の要素と一致します。マッチング全体が完了すると、残りの要素は重複排除されたキューになります。
var arr=[6, 4, 6, 9, '6', 13, 56, 9, ,'11',1, 8, '7', 17, 5, 45, 3, 7]; function unqiue(array){ //排序数组,形成队列 array.sort(function(m,n){return m-n;}); ////排序后,队尾向前对比,如果相同,删除队尾,依次类推 function loop(Index){ if(Index>=1){ if(array[Index]===array[Index-1]){ arr.splice(Index,1); } loop(Index-1); } } loop(array.length-1); return array; } console.log(unqiue(arr));
アルゴリズムの長所と短所:
利点:
効率の向上
欠点:
最も効率的ではありません
INDEXOF 重複排除方法
ブラウザが IndexOf をサポートしているかどうかを確認します。indexOf は ecmaScript5 の新しいメソッドです。IE8 以下ではサポートされていません (IE8 は ecma5 の一部のみをサポートします)。
if (!Array.prototype.indexOf){ // 新增indexOf方法 Array.prototype.indexOf = function(item){ var result = -1, a_item = null; if (this.length == 0){ return result; } for(var i = 0, len = this.length; i < len; i++){ a_item = this[i]; if (a_item === item){ result = i; break; } } return result; } }