フラットなデータ構造をツリーのような構造に変換するにはどうすればよいですか?

RafałBagrowski

{}のフラット配列をツリーのような構造に変換する2つのヘルパー関数があるとしましょう。次のフラットデータを検討してください。

const data = [
     {
            "ID": 1,
            "Tier_1": "DataSource1",
            "Tier_2": "Area",
            "Tier_3": "General",
        },
        {
            "ID": 2,
            "Tier_1": "DataSource1",
            "Tier_2": "Financial",
            "Tier_3": "General",
        },
        {
            "ID": 3,
            "Tier_1": "DataSource1",
            "Tier_2": "Area",
            "Tier_3": "General",
        },
        {
            "ID": 4,
            "Tier_1": "DataSource2",
            "Tier_2": "Area",
            "Tier_3": "General",
        },
        {
            "ID": 5,
            "Tier_1": "DataSource2",
            "Tier_2": "Area",
            "Tier_3": "Management Plan",
        }
]

データには、次のようなツリーのような構造に変換したい3行の階層情報が含まれています(期待される出力)。

(最後の子は実際のDBオブジェクトですが、ツリーに分散されています)

const output = {
  "DataSource1: {
    "Area": {
        {
            "ID": 1,
            "Tier_1": "DataSource1",
            "Tier_2": "Area",
            "Tier_3": "General",
        },
        {
            "ID": 3,
            "Tier_1": "DataSource1",
            "Tier_2": "Area",
            "Tier_3": "General",
        },
      },
      "Financial": [
        {
            "ID": 2,
            "Tier_1": "DataSource1",
            "Tier_2": "Financial",
            "Tier_3": "General",
        },
      ]
  },
  "DataSource2: {
      "Area": [
          {
            "ID": 4,
            "Tier_1": "DataSource2",
            "Tier_2": "Area",
            "Tier_3": "General",
          },
          {
            "ID": 5,
            "Tier_1": "DataSource2",
            "Tier_2": "Area",
            "Tier_3": "Management Plan",
          }
       ]
      }
  }
}

私は実際にこれを達成するための関数を作成することができましたが、それらはそれほど柔軟ではありません(各関数名に記載されている深さ/暗さは固定されています)

2次元ツリーを返す関数:

const getDataCategoriesTwoDim = (data, mainCategory) => {
  const dataFields = [...data];
  let map = {};

  for (let i = 0; i < dataFields.length; i += 1) {
    const currentField = dataFields[i];
    const currentCategory = currentField[mainCategory];

    if (!map[currentCategory]) {
      map[currentCategory] = [];
    }
    map[currentCategory].push(currentField);
  }

  return map;
};

3次元ツリーを返す関数:

const getDataCategoriesThreeDim = (data, mainCategory, subCategory) => { // DIFF
  const dataFields = [...data];
  let map = {};

  for (let i = 0; i < dataFields.length; i += 1) {
    const currentField = dataFields[i];
    const currentCategory = currentField[mainCategory];
    const currentSubcategory = currentField[subCategory]; // DIFF

    if (!map[currentCategory]) {
      map[currentCategory] = {}; /DIFF
    }
    if (!map[currentCategory][currentSubcategory]) { // DIFF
      map[currentCategory][currentSubcategory] = []; // DIFF
    } // DIFF
    map[currentCategory][currentSubcategory].push(currentField); // DIFF
  }

  return map;
};

このように両方を呼び出して、期待される結果を得ることができます。

  getDataCategoriesTwoDim(data, 'Tier_2');
  getDataCategoriesThreeDim(data, 'Tier_2', 'Tier_3');

ご覧のとおり、コードの繰り返しとコピー&ペーストが非常に多くなっています。コメントの違いをマークしました。コードを1つの関数に書き直して、2、3、またはそれ以上の次元を設定するにはどうすればよいですか?

ニーナ・ショルツ

プロパティをネストするためのキーを取得し、オブジェクトの代わりに最後のキーの配列を追加することができます。後でオブジェクトをネストされた配列にプッシュします。

const
    groupBy = (data, keys) => data.reduce((r, o) => {
        keys
            .reduce((p, k, i, a) =>
                 p[o[k]] = p[o[k]] || (i + 1 === a.length ? [] : {}), r)
            .push(o);
        return r;
    }, Object.create(null)),
    data = [{ ID: 1, Tier_1: "DataSource1", Tier_2: "Area", Tier_3: "General" }, { ID: 2, Tier_1: "DataSource1", Tier_2: "Financial", Tier_3: "General" }, { ID: 3, Tier_1: "DataSource1", Tier_2: "Area", Tier_3: "General" }, { ID: 4, Tier_1: "DataSource2", Tier_2: "Area", Tier_3: "General" }, { ID: 5, Tier_1: "DataSource2", Tier_2: "Area", Tier_3: "Management Plan" }],
    result1 = groupBy(data, ["Tier_1", "Tier_2"]),
    result2 = groupBy(data, ["Tier_1", "Tier_2", "Tier_3"]);

console.log(result1);
console.log(result2);
.as-console-wrapper { max-height: 100% !important; top: 0; }

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

フラットリストをネストされたツリーのような構造に変換するにはどうすればよいですか?

分類Dev

PHPのツリーのようなデータ構造から要素の最後のレベルを取得するにはどうすればよいですか?

分類Dev

ember.jsルーターで「グラフ」(ツリーではない)構造を表現するにはどうすればよいですか?

分類Dev

エクスプローラーのファイルツリー構造にインデントを追加するにはどうすればよいですか?

分類Dev

(key1、list(key2、value))のような構造のリストをpysparkのデータフレームに変換するにはどうすればよいですか?

分類Dev

JavaScript: `eval`を使用せずにフラット配列をツリーのような構造に変換する

分類Dev

独自の効率的なデータ構造を作成するにはどうすればよいですか?

分類Dev

バイトスライスデータ型の構造をバイトに変換するにはどうすればよいですか?

分類Dev

Auto Call Recorderアプリのデータを失うことなく構造DBを変更するにはどうすればよいですか?

分類Dev

GoでフラットなJSONオブジェクトになるように、埋め込まれた構造体フィールドを持つ構造体をマーシャリングするにはどうすればよいですか?

分類Dev

JSONのようなデータ構造を深くトラバースして、合計を返すにはどうすればよいですか?

分類Dev

Juliaで可変構造体のデフォルトパラメータを設定するにはどうすればよいですか?

分類Dev

同じ構造を持たない複数のデータセットの列を合計するにはどうすればよいですか?

分類Dev

データテーブルをツリーのようなクラス構造に変換する

分類Dev

この複雑なデータ構造をGo構造体で表現するにはどうすればよいですか?

分類Dev

ヘッダーのないアップストリームフラットファイルの構造変更に続いて、新しいインポートコードを生成するにはどうすればよいですか?

分類Dev

swift 4のオブジェクトの配列のような構造で静的データを形成するにはどうすればよいですか?

分類Dev

フラットなデータ構造をツリーに変換する

分類Dev

Nstableview for OSXでツリービューのような構造を作成するにはどうすればよいですか?

分類Dev

ハッシュマップなどのデータ構造をAndroidの内部に保存するにはどうすればよいですか?

分類Dev

ローカルの変更でリモートデータベース構造を更新するにはどうすればよいですか?

分類Dev

初期化中にダミーのVueデータ構造を提供しないようにするにはどうすればよいですか?

分類Dev

多次元配列をより単純な構造に変換するにはどうすればよいですか?

分類Dev

構造のようなリンクリストに新しいノードを挿入するにはどうすればよいですか?もう一つ

分類Dev

ライフタイムが異なる複数のstr変数を使用して構造体を構築するにはどうすればよいですか?

分類Dev

ツリー構造で祖先の属性を取得するにはどうすればよいですか?

分類Dev

JAXB:複雑なネストされたデータ構造をマーシャリングするにはどうすればよいですか?

分類Dev

MySQLのInnoDBによって生成されたBツリーインデックス構造を表示するにはどうすればよいですか?

分類Dev

Haskellの複数のネットワークリクエストからデータ構造を作成するにはどうすればよいですか?

Related 関連記事

  1. 1

    フラットリストをネストされたツリーのような構造に変換するにはどうすればよいですか?

  2. 2

    PHPのツリーのようなデータ構造から要素の最後のレベルを取得するにはどうすればよいですか?

  3. 3

    ember.jsルーターで「グラフ」(ツリーではない)構造を表現するにはどうすればよいですか?

  4. 4

    エクスプローラーのファイルツリー構造にインデントを追加するにはどうすればよいですか?

  5. 5

    (key1、list(key2、value))のような構造のリストをpysparkのデータフレームに変換するにはどうすればよいですか?

  6. 6

    JavaScript: `eval`を使用せずにフラット配列をツリーのような構造に変換する

  7. 7

    独自の効率的なデータ構造を作成するにはどうすればよいですか?

  8. 8

    バイトスライスデータ型の構造をバイトに変換するにはどうすればよいですか?

  9. 9

    Auto Call Recorderアプリのデータを失うことなく構造DBを変更するにはどうすればよいですか?

  10. 10

    GoでフラットなJSONオブジェクトになるように、埋め込まれた構造体フィールドを持つ構造体をマーシャリングするにはどうすればよいですか?

  11. 11

    JSONのようなデータ構造を深くトラバースして、合計を返すにはどうすればよいですか?

  12. 12

    Juliaで可変構造体のデフォルトパラメータを設定するにはどうすればよいですか?

  13. 13

    同じ構造を持たない複数のデータセットの列を合計するにはどうすればよいですか?

  14. 14

    データテーブルをツリーのようなクラス構造に変換する

  15. 15

    この複雑なデータ構造をGo構造体で表現するにはどうすればよいですか?

  16. 16

    ヘッダーのないアップストリームフラットファイルの構造変更に続いて、新しいインポートコードを生成するにはどうすればよいですか?

  17. 17

    swift 4のオブジェクトの配列のような構造で静的データを形成するにはどうすればよいですか?

  18. 18

    フラットなデータ構造をツリーに変換する

  19. 19

    Nstableview for OSXでツリービューのような構造を作成するにはどうすればよいですか?

  20. 20

    ハッシュマップなどのデータ構造をAndroidの内部に保存するにはどうすればよいですか?

  21. 21

    ローカルの変更でリモートデータベース構造を更新するにはどうすればよいですか?

  22. 22

    初期化中にダミーのVueデータ構造を提供しないようにするにはどうすればよいですか?

  23. 23

    多次元配列をより単純な構造に変換するにはどうすればよいですか?

  24. 24

    構造のようなリンクリストに新しいノードを挿入するにはどうすればよいですか?もう一つ

  25. 25

    ライフタイムが異なる複数のstr変数を使用して構造体を構築するにはどうすればよいですか?

  26. 26

    ツリー構造で祖先の属性を取得するにはどうすればよいですか?

  27. 27

    JAXB:複雑なネストされたデータ構造をマーシャリングするにはどうすればよいですか?

  28. 28

    MySQLのInnoDBによって生成されたBツリーインデックス構造を表示するにはどうすればよいですか?

  29. 29

    Haskellの複数のネットワークリクエストからデータ構造を作成するにはどうすればよいですか?

ホットタグ

アーカイブ