Javascript での配列の重複排除およびフラット化メソッドの例

高洛峰
リリース: 2017-02-03 13:01:28
オリジナル
1299 人が閲覧しました

配列の判定

配列の重複排除と平坦化の方法について話す前に、まず配列の判定方法について話しましょう。配列を処理するには、当然、渡されたデータが配列であるかどうかを判定する必要があります。

まず、js には 5 つのデータ型しかないことは誰もが知っています。つまり、配列は、typeof([]) によって返される単なるオブジェクトです。他の方法で判断するには、次の 2 つの方法があります。

最初の方法は、instanceof を使用することです

instanceof は、インスタンスが特定のクラスのインスタンスであるかどうかを判断するために使用できます。たとえば:

[] instenceof Array
//返回结果是true
ログイン後にコピー

このメソッドの欠点は次のとおりです。互換性 いいえ、ES5 をサポートしていない下位バージョンのブラウザでは混乱を招く可能性があります。

2つ目の方法は、プロトタイプチェーンを通して判断する方法です

jsを理解している人であれば、js言語の特徴はすべてのオブジェクトがObject.prototypeを継承しており、プロトタイプにはtoString()メソッドがあることを理解しているはずです。この toString() メソッドは何に使用されますか?現在のオブジェクトの値を文字列の形式で返します。初めてこの文を読んだときは理解できないかもしれません。例を示します。

var num = 123;
num.toString(); //返回结果为"123"
ログイン後にコピー

少しは理解できましたか?オブジェクト値 num の文字列形式、つまり「123」を返します。さて、これは配列の判定と何の関係があるのでしょうか?考えてみてください。すべてのオブジェクトは Object.prototype から継承しており、配列も同様です。配列を Object.prototype に「値」として送信して toString() メソッドを呼び出すと、オブジェクトの名前が表示されるはずです。これが判定の原理です。 コードは次のとおりです。

Object.prototype.toString.call([]); //结果是"[object Array]"
ログイン後にコピー

これは、jQuery などのスクリプト ライブラリの isArray() で使用されるメソッドです。

配列の平準化

その後、まず配列の平準化とは何でしょうか。 [1,[2,[3,4],5]] を [1,2,3,4,5] に舗装するだけです。配列の平坦化については 2 つのアイデアがあります。2 つ目はかなり奇妙なものなので、少し不安を残しておいてください (笑)。

1 つ目は従来の考え方です

配列内に配列がある場合は、すべての要素が走査されるまでそれを走査し続け、走査中にそれを新しい配列変数に挿入します。具体的なコードは次のとおりです:

panelArr = function(arr){
 var newArr = [];
 var isArray = function(obj) {
  return Object.prototype.toString.call(obj) === '[object Array]';
 };
 var dealArr = function(arr){
  for (var i = 0;i<arr.length;i++){
   isArray(arr[i]) ? dealArr(arr[i]) : newArr.push(arr[i]);
  }
 };
 dealArr(arr);
 return newArr;
};
console.log(panelArr([1,[2,3]])); //[1,2,3]
ログイン後にコピー

もちろん、このメソッドは Array.prototype で記述することもでき、その方が使いやすいです。この方法の問題の 1 つは、データ量が大きい場合、再帰によって多くのメモリが占​​有されるため、メモリ使用量です。

2 番目の奇妙なアイデア

2 番目のアイデアは、配列を見たり走査したりせずに配列を平坦化することです。少し奇妙に聞こえますが、どうすればトラバースせずにフラットに撃つことができますか? join() メソッドを使用して配列を文字列に変換し、通常の記号を削除して最後にマージするだけです。このメソッドを使用する場合は、このように分割すると 13 1 と 3 になるため、join("") を行わないように注意してください。それとも13?区別するのは難しいですが、コードは次のとおりです:

var arr = [1,2,[33,43],20,19];
arr.join(".").replace(/,/g,".").split("."); //["1", "2", "33", "43", "20", "19"]
ログイン後にコピー

注: このメソッドはデータ型を文字列に変換します。

配列の重複排除

たとえば、[1,2,3,3,4,5,5,5,6] は [1,2,3,4,5,6] ] になります。この実装の核心は、重複を削除することです。重要なのは、要素が繰り返されているかどうかを迅速に判断できることです。

まだ 2 つのアイデアがあります

最初のトラバーサルのアイデアは、挿入する前に毎回この変数をトラバースして重複があるかどうかを確認し、重複がない場合は挿入して最終的に生成することです。新しいアレイは重複排除後のアレイです。サンプルコードは以下の通りです。

function uniqueArr(arr){
 var newArr = [];
 newArr.push(arr[0]);
 for(var i = 1; i<arr.length;i++){
 var repeat = false;
 for(var j = 0;j<newArr.length;j++){
 if(arr[i] == newArr[j]){
 repeat = true;
 }
 }
 if(!repeat){
 newArr.push(arr[i]);
 }
 }
 return newArr;
}
ログイン後にコピー

2番目の方法はハッシュ判定を使用する方法です

時間計算量がO(n^2)の上記の方法は、良い方法ではありません。これを繰り返すため、重複を取得するより効率的な方法に切り替えましょう。この方法はハッシュの取得が最も速いのはなぜでしょうか。データ構造を見てみましょう。ここでは詳細には触れません。

この方法の考え方は、元の配列と重複排除された配列の間にハッシュ フィルターを追加することです。一般的に、元の配列データがハッシュに渡され、重複がない場合は追加されます。具体的なコードは次のとおりです。

function uniqueArr(arr){
 var newArr = [],
 hashFilter = {};
 for(var i = 0;i<arr.length;i++){
 if(!hashFilter[arr[i]]){
 //若不存在将此属性对应的值改为true,并塞入去重数组中
 hashFilter[arr[i]] = true;
 newArr.push(arr[i]);
 }
 }
 return newArr;
}
ログイン後にコピー

私は 2 番目のコードを好みます。繰り返すかどうかの判断が非常に速く、数秒で完了すると言えるからです。

概要

上記がこの記事の全内容です。この記事の内容が皆さんの学習や仕事に少しでも役立つことを願っています。ご質問がある場合は、メッセージを残して連絡してください。

JavaScript での配列の重複排除と平坦化メソッドのその他の例については、PHP 中国語 Web サイトに注目してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート