ホームページ ウェブフロントエンド jsチュートリアル Javascript での配列の重複排除およびフラット化メソッドの例

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

Feb 03, 2017 pm 01:01 PM

配列の判定

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

まず、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 サイトに注目してください。

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

独自のJavaScriptライブラリを作成および公開するにはどうすればよいですか? 独自のJavaScriptライブラリを作成および公開するにはどうすればよいですか? Mar 18, 2025 pm 03:12 PM

記事では、JavaScriptライブラリの作成、公開、および維持について説明し、計画、開発、テスト、ドキュメント、およびプロモーション戦略に焦点を当てています。

ブラウザでのパフォーマンスのためにJavaScriptコードを最適化するにはどうすればよいですか? ブラウザでのパフォーマンスのためにJavaScriptコードを最適化するにはどうすればよいですか? Mar 18, 2025 pm 03:14 PM

この記事では、ブラウザでJavaScriptのパフォーマンスを最適化するための戦略について説明し、実行時間の短縮、ページの負荷速度への影響を最小限に抑えることに焦点を当てています。

フロントエンドのサーマルペーパーレシートのために文字化けしたコード印刷に遭遇した場合はどうすればよいですか? フロントエンドのサーマルペーパーレシートのために文字化けしたコード印刷に遭遇した場合はどうすればよいですか? Apr 04, 2025 pm 02:42 PM

フロントエンドのサーマルペーパーチケット印刷のためのよくある質問とソリューションフロントエンド開発におけるチケット印刷は、一般的な要件です。しかし、多くの開発者が実装しています...

ブラウザ開発者ツールを使用してJavaScriptコードを効果的にデバッグするにはどうすればよいですか? ブラウザ開発者ツールを使用してJavaScriptコードを効果的にデバッグするにはどうすればよいですか? Mar 18, 2025 pm 03:16 PM

この記事では、ブラウザ開発者ツールを使用した効果的なJavaScriptデバッグについて説明し、ブレークポイントの設定、コンソールの使用、パフォーマンスの分析に焦点を当てています。

誰がより多くのPythonまたはJavaScriptを支払われますか? 誰がより多くのPythonまたはJavaScriptを支払われますか? Apr 04, 2025 am 12:09 AM

スキルや業界のニーズに応じて、PythonおよびJavaScript開発者には絶対的な給与はありません。 1. Pythonは、データサイエンスと機械学習でさらに支払われる場合があります。 2。JavaScriptは、フロントエンドとフルスタックの開発に大きな需要があり、その給与もかなりです。 3。影響要因には、経験、地理的位置、会社の規模、特定のスキルが含まれます。

ソースマップを使用して、マイナイドJavaScriptコードをデバッグするにはどうすればよいですか? ソースマップを使用して、マイナイドJavaScriptコードをデバッグするにはどうすればよいですか? Mar 18, 2025 pm 03:17 PM

この記事では、ソースマップを使用して、元のコードにマッピングすることにより、Minified JavaScriptをデバッグする方法について説明します。ソースマップの有効化、ブレークポイントの設定、Chrome DevtoolsやWebpackなどのツールの使用について説明します。

chart.js:パイ、ドーナツ、バブルチャートを始めます chart.js:パイ、ドーナツ、バブルチャートを始めます Mar 15, 2025 am 09:19 AM

このチュートリアルでは、chart.jsを使用してパイ、リング、およびバブルチャートを作成する方法について説明します。以前は、4つのチャートタイプのchart.js:ラインチャートとバーチャート(チュートリアル2)、およびレーダーチャートと極地域チャート(チュートリアル3)を学びました。 パイとリングチャートを作成します パイチャートとリングチャートは、さまざまな部分に分かれている全体の割合を示すのに理想的です。たとえば、パイチャートを使用して、サファリの男性ライオン、女性ライオン、若いライオンの割合、または異なる候補者が選挙で受け取る票の割合を示すことができます。 パイチャートは、単一のパラメーターまたはデータセットの比較にのみ適しています。パイチャートのファンの角度はデータポイントの数値サイズに依存するため、パイチャートは値のあるエンティティをゼロ値で描画できないことに注意してください。これは、割合がゼロのエンティティを意味します

Console.log出力の違い結果:なぜ2つの呼び出しが異なるのですか? Console.log出力の違い結果:なぜ2つの呼び出しが異なるのですか? Apr 04, 2025 pm 05:12 PM

Console.log出力の違いの根本原因に関する詳細な議論。この記事では、Console.log関数の出力結果の違いをコードの一部で分析し、その背後にある理由を説明します。 �...

See all articles