まず第一に、私が考えたのは、元の配列に一意のデータを格納するために別の結果配列を作成することでした。元の配列を走査し、結果配列の要素と比較して重複を検出します。そこで、次の コード A を書きました。
Array.prototype.clearRepetitionA = function(){ var result = []; var isRepetition; for(var i=0; i<this.length; i++){ isRepetition = false; for(var j=0; j<result.length; j++){ if(this[i] === result[j]){ isRepetition = true; break; } } if(!isRepetition){ result.push(this[i]); } } return result; }
書き終えた後、数日前に読んだばかりのECMAScript 5の配列メソッドindexOfが配列要素を取得できることを突然思い出しました。そこで、indexOf メソッドを使用して第 2 レベルのループを置き換え、次の コード B:
を書きました。
Array.prototype.clearRepetitionB = function(){ var result = []; for(var i=0; i<this.length; i++){ if(result.indexOf(this[i]) == -1){ result.push(this[i]); } } return result; }
コードは 17 行から 9 行に突然変更され、はるかに単純になりました。高校数学の大問題を解く方法は通常複数あり、その後は別の方法を考え続けます。 IndexOf メソッドは、配列全体で指定された値を持つ要素を検索し、見つかった最初の要素のインデックスを返します。最初のパラメーターは検索する値で、2 番目のパラメーターは -1 を返します。はオプションです。このパラメータを省略すると、検索を開始する配列内のインデックスを指定します。考え始めると、以前は値が重複しているかどうかを検出する方法だったと思いましたが、indexOf メソッドを使用したことで、検出された各要素の最初の出現のインデックスとインデックス値に基づいて判断できるようになりました。要素自体が繰り返されていますか?そこで、コード C:
を書きました。
Array.prototype.clearRepetitionC = function(){ var result = [this[0]]; for(var i=1; i<this.length; i++){ if(this.indexOf(this[i]) == i){ result.push(this[i]); } } return result; }
これを書いた後も考え続けましたが、これら 3 つの方法はどれも非常に基本的なものです。そこで、答えを比較して自分自身をテストしてみました。答えを見てみると、私はまだ力不足で、単純な質問にも素晴らしいアイデアが含まれていることがわかりました。以下は私が考えていることではないので、私の精神的な旅についてはあまり話しません。早速、古典的な解答分析に直接進みましょう。
まず、空間を時間と交換してフォーメーションを維持するためのアルゴリズムでよく言われる解決策について説明します。これを コード D と呼びましょう。
Array.prototype.clearRepetitionD = function(){ var result = []; var obj = {}; var key,type; for(var i=0; i<this.length; i++){ key = this[i]; type = typeof key; if(!obj[key]){ obj[key] = [type]; result.push(key); }else if(obj[key].indexOf(type)){ obj[key].push(type); result.push(key); } } return result; }
空間を時間と交換する上記の効率的な方法に満足して読み続けないのであれば、あなたは完全に間違っています。最高のものは常にやって来ます。さあ、お楽しみが始まります。それが
コード E: であることは間違いありません。
Array.prototype.clearRepetitionE = function(){ var result = []; for(var i=0; i<this.length; i++){ for(var j=i+1; j<this.length; j++){ if(this[i] === this[j]){ j = ++i; } } result.push(this[i]); } return result; }
コード E の分析を読んだ後、あなたはすでに親指を立てて賞賛の目で私を見つめましたか? (これらの花と栄誉は私に与えないでください。このメソッドを書いたマスターに贈られるべきです)。
最後の方法について話しましょう: これは、最初に並べ替えてから重複を削除することです。古いルールに従って、これは コード F と呼ばれます:
Array.prototype.clearRepetitionF = function(){ this.sort(); var result = [this[0]]; for(var i=1; i<this.length; i++){ if(this[i] !== result[result.length-1]){ result.push(this[i]); } } return result; }
上記は
JavaScript 配列の重複排除 の問題に関する段階的な研究であり、合計 6 つのコードが共有されることを願っています。何かを得る。