Javascriptにおける配列の重量と撮影の方法例


配列の判定
どのように配列のデバッグとパッティングを行うかという前に、まず配列をどう判断するかを言います。配列の処理を行うには当然、伝達されたデータが配列かどうかを判断します。
まず、jsのデータタイプは5種類しかないことを知っています。それぞれUnidefined、Null、Boolean、Number、Stringです。配列は一つのオブジェクトだけで、typeof([])で戻ってきた結果はObjectの文字列を知るために、他の手段でそれを判断する必要があります。ここでは2つの方法を説明します。
第一の方法はinstenceofメソッドです。
instance ofは、ES 5が提供する方法であり、インスタンスがあるクラスのインスタンスであるかどうかを判断するために使用され得る。

[] instenceof Array
//     true
この方法の悪いところは互換性がよくないです。いくつかの低いバージョンのブラウザでES 5をサポートしないと、愚かになります。
第二の方法はプロトタイプチェーンで判断します。
jsを理解すれば、jsという言葉の特徴は原型チェーン式で、すべての対象はObject.prototypeから継承されていますが、prototypeにはtoString()の方法があります。このtoString()の方法は何をするものですか?は、現在のオブジェクトの値を文字列で返します。初めて見ると、この言葉はよく分からないかもしれませんが、例を挙げてください。

var num = 123;
num.toString(); //     "123"
ちょっと分かりますか?numという対象値を返す文字列形式、つまり「123」です。はい、これは判定配列と何の関係がありますか?すべてのオブジェクトがObject.prototypeから継承されていると考えてもいいです。配列はObject.prototypeに1つの配列を「値」として送れば、toString()メソッドを呼び出して、このオブジェクトの名前を示すべきです。これは判断の原理です。コードは以下の通りです。

Object.prototype.toString.call([]); //   "[object Array]"
jQueryのようなスクリプトライブラリのisArray()はこの方法を使っています。
行列写真
まっすぐ行くというテーマを言いましたが、まず行列が引き分けとなります。何が行列が引き分けとなりますか?[1,[2,3,4],5]を[1,2,3,4,5]に敷きます。配列写真については二つの考えがあります。二つ目はちょっと面白いです。心配してください。
第一は常道的な考え方である。
配列を遍歴します。配列の中に配列が含まれていると、各要素が遍歴されるまで、そして遍歴しながら新しい配列変数に詰め込まれます。これで写真撮影が終わります。具体的なコードは以下の通りです。

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にも書いてもいいです。使いやすいです。この方法にはメモリの占有が問題があります。再帰的にデータ量が大きいと大量のメモリを占めるからです。
第二の変な考え方
第二の考え方は、配列を見なくても、遍歴せずに直接に撮ります。ちょっと変に聞こえますが、遍歴しないで写真を撮ってもいいですか?join()方法を使用して、配列を文字列に変換し、正則符号を削除して最後に合成するという方法です。この方法は、このように分割すると、13は1と3ですか?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,6]は[1,2,3,4,5,6]になります。この実現の核心はここを重視することです。要素が重複しているかどうかを迅速に判断できるということが鍵です。
まだ二つの考えです
最初の遍歴の考え方
つまり、新しい配列変数を準備して、詰め込む前に毎回この変数を巡回してみます。重複があるかどうかを確認してみます。ない場合は詰め込みます。最後に生成された新しい配列は元の配列になります。サンプルコードは以下の通りです

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;
}
第二に、ハッシュ判定を使用する。
上記の時間の複雑さはjoin("")の方法ではありません。ボトルネックはここを繰り返すかどうかを判断します。だから、より効率的な検索が繰り返されるかどうかを切り替える方法です。この方法はハッシュです。なぜハッシュ検索が一番早いですか?データ構造をひっくり返しましょう。ここでは詳しく説明しません。
この方法の考え方は、元の配列とデ重い配列の間にハッシュフィルタを入れて、全体的には元の配列データをハッシュに渡し、重複があるかどうかを見て、ない場合は追加します。具体的なコードは以下の通りです。

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;
}
私は二番目が好きです。ここを繰り返すかどうかを判断するのは本当に早いので、秒出と言えます。
締め括りをつける
以上はこの文章の全部の内容です。本文の内容は皆さんの学習や仕事に一定の助けをもたらしてほしいです。もし疑問があれば、メッセージを残して交流してもいいです。