ホームページ >ウェブフロントエンド >jsチュートリアル >JavaScript配列重複排除問題の詳しい解説_JavaScriptスキル

JavaScript配列重複排除問題の詳しい解説_JavaScriptスキル

WBOY
WBOYオリジナル
2016-05-16 15:33:171199ブラウズ

まず第一に、私が考えたのは、元の配列に一意のデータを格納するために別の結果配列を作成することでした。元の配列を走査し、結果配列の要素と比較して重複を検出します。そこで、次の コード 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;
 } 
このメソッドでは、元の配列を走査するときに、オブジェクト obj の属性を使用して、元の配列内の要素の値を保存します。同時に、この属性の値は配列であり、この属性の型を格納するために使用されます。これにより、元の配列内の数値 1 に類似した要素と文字列 '1' の要素を区別できます。この方法は、上記 3 つの方法のうち、indexOf メソッドを追加のオブジェクトを構築することで時間を短縮し、より効率的であると言えます。

空間を時間と交換する上記の効率的な方法に満足して読み続けないのであれば、あなたは完全に間違っています。最高のものは常にやって来ます。さあ、お楽しみが始まります。それが
コード 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;
 }
コード D は空間を時間に置き換えますが、その感覚はごく平均的です。コードEはどうでしょうか?このコードは間違っているのでしょうか?本当に重複を削除できますか?はい、最初はコードが理解できませんでした。分析を読んでもう一度読むまで理解できませんでした。次に、理解できない読者は、分析を注意深く読む必要があります。最初のレベルは元の配列を前から後ろに走査し、2 番目のレベルのループは、各要素がその後ろにある要素と繰り返されているかどうかを検出します。 , この要素の後のすべての要素が一意である場合は、それをスキップして、結果の配列に追加します。このメソッドを実装する考え方は、重複することなく右端の値を取得して結果の配列に追加することです。最初のメソッドと比較すると、第 2 レベルのループも最適化され、結果としてはより効率的になります。このメソッドの配列 要素の順序は、元の配列の要素の順序と異なります。

コード 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;
 } 
これは、まず配列ソートメソッドsortを使用して配列要素をソートし、次に複製作業を実行します。

上記は

JavaScript 配列の重複排除 の問題に関する段階的な研究であり、合計 6 つのコードが共有されることを願っています。何かを得る。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。