JavaScript のフラット配列をツリー構造に変換する例

JavaScript のフラット配列をツリー構造に変換する例

バックグラウンドで10,000個のデータが失われた

どれだけ計画を立てても、逃れられませんでした。バックエンドは本当に一度に何万ものデータをフロントエンドに投げ込んでいました。まあ、少なくともまだ10万には達していません。以下に示すように、背景は次の構造を返します。

定数flatArr = [
  { id: '001'、名前: 'ノード 1' },
  { id: '0011'、親ID: '001'、名前: 'ノード1-1' },
  { id: '00111'、親ID: '0011'、名前: 'ノード 1-1-1' },
  { id: '002'、名前: 'ノード 2' },
]

ご覧のとおり、これは実際にはフラットな配列です。私たちの要件は、次のようなツリー構造を受け取る Element-ui のカスケード セレクターでこのようなデータをレンダリングすることです。

オプション = [
  {
    値: 'zhinan'、
    ラベル: 'ガイド'、
    子供たち: [
      {
        値: 'shejiyuanze'、
        ラベル: 「デザイン原則」、
        子供たち: [
          { 値: 'yizhi'、ラベル: 'consistent' },
          { 値: 'fankui'、ラベル: 'フィードバック'}
        ]、
      }
    ]
  }
]

ああ、これはフラット配列をツリー構造に変換する必要がある!
その作戦は虎のように獰猛で、一言も発することなく再帰が書かれていた。

再帰法

完成しました。コードは簡潔で、アイデアは明確です。実行するとどうなるでしょうか?ページが停止しています。console.time() によると、必要なツリー構造を計算するのに約 18 秒かかりました。
自分を振り返ってみました。何万ものデータがあります。親ノードの子ノードを下から上へ再帰的に検索するたびに、配列を 1 回走査する必要があり、当然時間がかかります。さらに、計算時間によってページがフリーズするのは明らかなので、この方法は絶対にお勧めできません。では、もっと良い解決策はあるのでしょうか?

非再帰的方法

ここでは、オブジェクトが参照を保存する機能を巧みに適用しています。毎回、現在のノードの ID がキーとして使用され、対応するノードの参照情報が保存されます。配列をトラバースすると、objMap の子情報が毎回更新されます。このようにして、すべてのノードとその子ノードが objMap に保持されます。最も重要なのは、配列を 1 回トラバースするだけでよく、時間の計算量は O(n) であることです。この方法を使用すると、計算時間はわずか 60 ミリ秒です。

要約する

  • 再帰的方法: 現在のノードの子ノードを再帰的に検索するたびに、配列を再度走査する必要があり、時間の計算量は O(nlogn) です。
  • 非再帰的方法: ルートノードから下に向かって子ノードを検索し、各ノードとその子ノードの情報をマップに保存します。子ノードはマップ上の参照を保存し、各ノードの子ノードは ID によってマップ内で見つけることができます。時間計算量は O(n) です。

比較表を見てみましょう:

データ量が増えるにつれて時間の計算量も増加するという上記の傾向から、データがどんどん大きくなると、再帰アルゴリズムによって消費される時間は非再帰アルゴリズムによって消費される時間よりもはるかに長くなることがわかります。したがって、データ量が少ない場合は再帰アルゴリズムを使用すると一定の利点がありますが、データがある程度大きくなると、再帰アプローチの欠点がますます明らかになり、非再帰アルゴリズムを使用する方がはるかに高速になります。

最後に、この比較を通じて、アルゴリズムの重要性をはっきりと感じることができると言わなければなりません。実装方法が異なると大きな違いが生じる可能性があり、すべての開発者が注目する価値があります。

JavaScript のフラット配列をツリー構造に変換する実装例については、これで終わりです。JavaScript のフラット配列をツリー構造に変換することに関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Vue.js ツリー コンポーネントを削除してダブルクリックし、ブランチを追加するサンプル コード
  • Java と JS で無限ツリー構造を実装する方法 (再帰に似ています)
  • JavaScript ツリー コンポーネントは無限のツリー構造を実現します

<<:  MySQL SQL ステートメントが遅い場合の一般的な原因と解決策

>>:  VMware Workstation での VMware vSphere のセットアップ (グラフィック チュートリアル)

推薦する

HTML(divレイヤー)を介してFLASHにリンクを追加するための実装コード

今日、クライアントが広告を掲載したいのですが、提供された素材は Flash です。私たちはあまり気に...

vue3のテレポート瞬間移動機能の使い方を詳しく解説

vue3テレポート瞬間移動機能の使用は参考用です。具体的な内容は次のとおりです。テレポートは通常、瞬...

NginxはIP経由の直接アクセスを禁止し、カスタム500ページにリダイレクトします

設定ファイルに直接 サーバー{ listen 80 default; # IPへの直接アクセスを禁止...

Dockerイメージ内のファイルを表示する方法

Dockerイメージ内のファイルを表示する方法1. すでに実行中の場合すでに実行中のイメージについて...

LinuxにMySQLをインストールするための詳細なチュートリアル

すべてのプラットフォーム用の MySQL ダウンロードは、MySQL ダウンロードから入手できます。...

最も完全な 50 の MySQL データベース クエリ演習

このデータベース クエリ ステートメントは、インターネット上の 50 個のデータベース クエリ練習問...

Dockerはredis 5.0.7をインストールし、外部構成とデータの問題をマウントします

Redis は、ANSI C で記述されたオープンソースの NoSQL データベースであり、ネットワ...

MySQL Workbench の使い方チュートリアルの詳しい説明

目次(I) Workbenchを使用してデータベースを操作する①データベースを作成する② データベー...

Linux での JDK と Tomcat のアップロードと設定に関する詳細なチュートリアル

準備1. 仮想マシンを起動する2. gitツールルートアカウントでログインルートアカウントを使用して...

MySQLのロックについて理解しておくべきこと

1. はじめにMySQL ロックは、その範囲に応じて、グローバル ロック、テーブル ロック、行ロック...

Vueコンポーネントが相互に値を転送する方法の詳細な説明

目次概要1. 親コンポーネントが子コンポーネントに値を渡す2. 子コンポーネントが親コンポーネントに...

Nginx 502 Bad Gateway エラーの原因と解決策

Nginx 502 Bad Gateway エラーに何度か遭遇しました。ここでメモしておこうと思いま...

ショートビデオ(Douyin)の透かし除去ツールの実装コード

目次1. まず最初のリンクを取得する2. ブラウザでこのリンクを開いてください3. アドレスを開くと...

Vueデータ双方向バインディング実装方法

目次1. はじめに2. コードの実装2.1 目的分析2.2 実装プロセス2.2.1 エントリーコード...