簡體   English   中英

使用 javascript 將平面數組轉換為樹結構

[英]Converting flat array to tree structure with javascript

我在轉換平面陣列時遇到問題,可以使用您的幫助!

目前數據格式是這樣的:

    [
        {
            "MASTER_ACCOUNT_NAME": "MAIN_ENTITY",
            "SUB_ACCOUNT_NAME": null,
            "TERTIARY_ACCOUNT_NAME": null,
            "MARKET_VALUE": 6,
            "OVERALL_MARKET_VALUE": 1
        },
        {
            "MASTER_ACCOUNT_NAME": "MAIN_ENTITY",
            "SUB_ACCOUNT_NAME": "MAIN_ACCOUNT",
            "TERTIARY_ACCOUNT_NAME": null,
            "MARKET_VALUE": 1,
            "OVERALL_MARKET_VALUE": 8
        },
        {
            "MASTER_ACCOUNT_NAME": "MAIN_ENTITY",
            "SUB_ACCOUNT_NAME": "MAIN_ACCOUNT",
            "TERTIARY_ACCOUNT_NAME": "TERTIARY_ACCOUNT_1",
            "MARKET_VALUE": 10,
            "OVERALL_MARKET_VALUE": 5
        },
        {
            "MASTER_ACCOUNT_NAME": "MAIN_ENTITY",
            "SUB_ACCOUNT_NAME": "MAIN_ACCOUNT",
            "TERTIARY_ACCOUNT_NAME": "TERTIARY_ACCOUNT_2",
            "MARKET_VALUE": 5,
            "OVERALL_MARKET_VALUE": 3
        },
        {
            "MASTER_ACCOUNT_NAME": "MAIN_ENTITY",
            "SUB_ACCOUNT_NAME": "SECOND_ACCOUNT",
            "TERTIARY_ACCOUNT_NAME": null,
            "MARKET_VALUE": 5,
            "OVERALL_MARKET_VALUE": 10
        },
        {
            "MASTER_ACCOUNT_NAME": "MAIN_ENTITY",
            "SUB_ACCOUNT_NAME": "SECOND_ACCOUNT",
            "TERTIARY_ACCOUNT_NAME": "TERTIARY_ACCOUNT_1",
            "MARKET_VALUE": 6,
            "OVERALL_MARKET_VALUE": 1
        },
        {
            "MASTER_ACCOUNT_NAME": "MAIN_ENTITY",
            "SUB_ACCOUNT_NAME": "SECOND_ACCOUNT",
            "TERTIARY_ACCOUNT_NAME": "TERTIARY_ACCOUNT_2",
            "MARKET_VALUE": 10,
            "OVERALL_MARKET_VALUE": 5
        },
        {
            "MASTER_ACCOUNT_NAME": "SECOND_ENTITY",
            "SUB_ACCOUNT_NAME": null,
            "TERTIARY_ACCOUNT_NAME": null,
            "MARKET_VALUE": 6,
            "OVERALL_MARKET_VALUE": 1
        },
        {
            "MASTER_ACCOUNT_NAME": "SECOND_ENTITY",
            "SUB_ACCOUNT_NAME": "MAIN_ACCOUNT",
            "TERTIARY_ACCOUNT_NAME": null,
            "MARKET_VALUE": 1,
            "OVERALL_MARKET_VALUE": 8
        },
        {
            "MASTER_ACCOUNT_NAME": "SECOND_ENTITY",
            "SUB_ACCOUNT_NAME": "MAIN_ACCOUNT",
            "TERTIARY_ACCOUNT_NAME": "TERTIARY_ACCOUNT_1",
            "MARKET_VALUE": 10,
            "OVERALL_MARKET_VALUE": 5
        },
        {
            "MASTER_ACCOUNT_NAME": "SECOND_ENTITY",
            "SUB_ACCOUNT_NAME": "MAIN_ACCOUNT",
            "TERTIARY_ACCOUNT_NAME": "TERTIARY_ACCOUNT_2",
            "MARKET_VALUE": 5,
            "OVERALL_MARKET_VALUE": 3
        },
        {
            "MASTER_ACCOUNT_NAME": "SECOND_ENTITY",
            "SUB_ACCOUNT_NAME": "SECOND_ACCOUNT",
            "TERTIARY_ACCOUNT_NAME": null,
            "MARKET_VALUE": 5,
            "OVERALL_MARKET_VALUE": 10
        },
        {
            "MASTER_ACCOUNT_NAME": "SECOND_ENTITY",
            "SUB_ACCOUNT_NAME": "SECOND_ACCOUNT",
            "TERTIARY_ACCOUNT_NAME": "TERTIARY_ACCOUNT_1",
            "MARKET_VALUE": 6,
            "OVERALL_MARKET_VALUE": 1
        },
        {
            "MASTER_ACCOUNT_NAME": "SECOND_ENTITY",
            "SUB_ACCOUNT_NAME": "SECOND_ACCOUNT",
            "TERTIARY_ACCOUNT_NAME": "TERTIARY_ACCOUNT_2",
            "MARKET_VALUE": 10,
            "OVERALL_MARKET_VALUE": 5
        }
    ]

我希望最終得到這樣的結果:

    [
        {
            "MASTER_ACCOUNT_NAME": "MAIN_ENTITY",
            "SUB_ACCOUNT_NAME": null,
            "TERTIARY_ACCOUNT_NAME": null,
            "MARKET_VALUE": 6,
            "OVERALL_MARKET_VALUE": 1,
            "children": [
                {
                    "MASTER_ACCOUNT_NAME": "MAIN_ENTITY",
                    "SUB_ACCOUNT_NAME": "MAIN_ACCOUNT",
                    "TERTIARY_ACCOUNT_NAME": null,
                    "MARKET_VALUE": 1,
                    "OVERALL_MARKET_VALUE": 8,
                    "children": [
                        {
                            "MASTER_ACCOUNT_NAME": "MAIN_ENTITY",
                            "SUB_ACCOUNT_NAME": "MAIN_ACCOUNT",
                            "TERTIARY_ACCOUNT_NAME": "TERTIARY_ACCOUNT_1",
                            "MARKET_VALUE": 10,
                            "OVERALL_MARKET_VALUE": 5
                        },
                        {
                            "MASTER_ACCOUNT_NAME": "MAIN_ENTITY",
                            "SUB_ACCOUNT_NAME": "MAIN_ACCOUNT",
                            "TERTIARY_ACCOUNT_NAME": "TERTIARY_ACCOUNT_2",
                            "MARKET_VALUE": 5,
                            "OVERALL_MARKET_VALUE": 3
                        },
                    ]
                },
                {
                    "MASTER_ACCOUNT_NAME": "MAIN_ENTITY",
                    "SUB_ACCOUNT_NAME": "SECOND_ACCOUNT",
                    "TERTIARY_ACCOUNT_NAME": null,
                    "MARKET_VALUE": 5,
                    "OVERALL_MARKET_VALUE": 10,
                    "children": [
                        {
                            "MASTER_ACCOUNT_NAME": "MAIN_ENTITY",
                            "SUB_ACCOUNT_NAME": "SECOND_ACCOUNT",
                            "TERTIARY_ACCOUNT_NAME": "TERTIARY_ACCOUNT_1",
                            "MARKET_VALUE": 6,
                            "OVERALL_MARKET_VALUE": 1
                        },
                        {
                            "MASTER_ACCOUNT_NAME": "MAIN_ENTITY",
                            "SUB_ACCOUNT_NAME": "SECOND_ACCOUNT",
                            "TERTIARY_ACCOUNT_NAME": "TERTIARY_ACCOUNT_2",
                            "MARKET_VALUE": 10,
                            "OVERALL_MARKET_VALUE": 5
                        },
                    ]
                },
            ]
        },
        {
            "MASTER_ACCOUNT_NAME": "SECOND_ENTITY",
            "SUB_ACCOUNT_NAME": null,
            "TERTIARY_ACCOUNT_NAME": null,
            "MARKET_VALUE": 6,
            "OVERALL_MARKET_VALUE": 1,
            "children": [
                {
                    "MASTER_ACCOUNT_NAME": "SECOND_ENTITY",
                    "SUB_ACCOUNT_NAME": "MAIN_ACCOUNT",
                    "TERTIARY_ACCOUNT_NAME": null,
                    "MARKET_VALUE": 1,
                    "OVERALL_MARKET_VALUE": 8,
                    "children": [
                        {
                            "MASTER_ACCOUNT_NAME": "SECOND_ENTITY",
                            "SUB_ACCOUNT_NAME": "MAIN_ACCOUNT",
                            "TERTIARY_ACCOUNT_NAME": "TERTIARY_ACCOUNT_1",
                            "MARKET_VALUE": 10,
                            "OVERALL_MARKET_VALUE": 5
                        },
                        {
                            "MASTER_ACCOUNT_NAME": "SECOND_ENTITY",
                            "SUB_ACCOUNT_NAME": "MAIN_ACCOUNT",
                            "TERTIARY_ACCOUNT_NAME": "TERTIARY_ACCOUNT_2",
                            "MARKET_VALUE": 5,
                            "OVERALL_MARKET_VALUE": 3
                        },
                    ]
                },
                {
                    "MASTER_ACCOUNT_NAME": "SECOND_ENTITY",
                    "SUB_ACCOUNT_NAME": "SECOND_ACCOUNT",
                    "TERTIARY_ACCOUNT_NAME": null,
                    "MARKET_VALUE": 5,
                    "OVERALL_MARKET_VALUE": 10,
                    "children": [
                        {
                            "MASTER_ACCOUNT_NAME": "SECOND_ENTITY",
                            "SUB_ACCOUNT_NAME": "SECOND_ACCOUNT",
                            "TERTIARY_ACCOUNT_NAME": "TERTIARY_ACCOUNT_1",
                            "MARKET_VALUE": 6,
                            "OVERALL_MARKET_VALUE": 5
                        },
                        {
                            "MASTER_ACCOUNT_NAME": "SECOND_ENTITY",
                            "SUB_ACCOUNT_NAME": "SECOND_ACCOUNT",
                            "TERTIARY_ACCOUNT_NAME": "TERTIARY_ACCOUNT_2",
                            "MARKET_VALUE": 10,
                            "OVERALL_MARKET_VALUE": 5
                        },
                    ]
                },
            ]
        },
    ]

為它的龐大而道歉,頂級部分將是 MASTER_ACCOUNT_NAME。 之后的級別將是 SUB_ACCOUNT_NAME,最低級別的項目將是 TERTIARY_ACCOUNT_NAME。

我已經多次嘗試使用 lodash 和 vanilla javascript 來做到這一點,但不得不承認數據操作並不是我真正的技能領域,我正在努力解決它!

提前感謝您為我提供的任何幫助!

此解決方案特定於您的示例數據,如果您有其他數據形狀,您可能需要對其進行調整。

但是,如果您有 1000 件商品,則不建議這樣做。

function makeTree(data) {
  return data
    .filter(
      (masterItem) =>
        masterItem.SUB_ACCOUNT_NAME === null &&
        masterItem.TERTIARY_ACCOUNT_NAME === null
    )
    .map((masterItem) => ({
      ...masterItem,
      children: data
        .filter(
          (subItem) =>
            subItem.MASTER_ACCOUNT_NAME === masterItem.MASTER_ACCOUNT_NAME &&
            subItem.SUB_ACCOUNT_NAME !== null &&
            subItem.TERTIARY_ACCOUNT_NAME === null
        )
        .map((subItem) => ({
          ...subItem,
          children: data.filter(
            (tertiaryItem) =>
              tertiaryItem.SUB_ACCOUNT_NAME === subItem.SUB_ACCOUNT_NAME &&
              tertiaryItem.TERTIARY_ACCOUNT_NAME !== null
          ),
        })),
    }));
}

使用 javascript 和 lambdas 來操作您的數組怎么樣? 像這樣的東西:

const yourArray = [....];
const result = yourArray.filter(obj => obj['SUB_ACCOUNT_NAME'] == null);
result.forEach(node => node["CHILDRENS"] = yourArray.filter(obj => obj['SUB_ACCOUNT_NAME'] != null && obj['TERTIARY_ACCOUNT_NAME'] == null && obj["MASTER_ACCOUNT_NAME"] == node["MASTER_ACCOUNT_NAME"]));

這創建了一個兩級結構..現在,要生成第三級,您需要為每個二級節點執行類似的操作..它可以用 function 進行概括.. 像這樣:

function putChildrenFromArray(nodes, elements, howToSelectSons) {
  nodes.forEach(node => node["CHILDRENS"] = elements.filter(obj => howToSelectSons(obj, node)));
}

像這樣稱呼它:

putChildrenFromArray(result, yourArray, (obj, father) => obj['SUB_ACCOUNT_NAME'] != null && obj['TERTIARY_ACCOUNT_NAME'] == null && obj["MASTER_ACCOUNT_NAME"] == father["MASTER_ACCOUNT_NAME"])

您可以將其稱為第二級..然后每個第一級節點一次,傳遞其子節點,當然,將 lambda / function 用於 Z99938282F04071859941E18F16

您應該在兩個 lambdas 之間更改最少的內容。如果您可以擁有更多級別,則可以將其概括得更多。

您可以將reduce方法與while循環和一個數組結合起來,以存儲不同級別的值,這些值將從另一個levels object映射。

 const data = [{"MASTER_ACCOUNT_NAME":"MAIN_ENTITY","SUB_ACCOUNT_NAME":null,"TERTIARY_ACCOUNT_NAME":null,"MARKET_VALUE":6,"OVERALL_MARKET_VALUE":1},{"MASTER_ACCOUNT_NAME":"MAIN_ENTITY","SUB_ACCOUNT_NAME":"MAIN_ACCOUNT","TERTIARY_ACCOUNT_NAME":null,"MARKET_VALUE":1,"OVERALL_MARKET_VALUE":8},{"MASTER_ACCOUNT_NAME":"MAIN_ENTITY","SUB_ACCOUNT_NAME":"MAIN_ACCOUNT","TERTIARY_ACCOUNT_NAME":"TERTIARY_ACCOUNT_1","MARKET_VALUE":10,"OVERALL_MARKET_VALUE":5},{"MASTER_ACCOUNT_NAME":"MAIN_ENTITY","SUB_ACCOUNT_NAME":"MAIN_ACCOUNT","TERTIARY_ACCOUNT_NAME":"TERTIARY_ACCOUNT_2","MARKET_VALUE":5,"OVERALL_MARKET_VALUE":3},{"MASTER_ACCOUNT_NAME":"MAIN_ENTITY","SUB_ACCOUNT_NAME":"SECOND_ACCOUNT","TERTIARY_ACCOUNT_NAME":null,"MARKET_VALUE":5,"OVERALL_MARKET_VALUE":10},{"MASTER_ACCOUNT_NAME":"MAIN_ENTITY","SUB_ACCOUNT_NAME":"SECOND_ACCOUNT","TERTIARY_ACCOUNT_NAME":"TERTIARY_ACCOUNT_1","MARKET_VALUE":6,"OVERALL_MARKET_VALUE":1},{"MASTER_ACCOUNT_NAME":"MAIN_ENTITY","SUB_ACCOUNT_NAME":"SECOND_ACCOUNT","TERTIARY_ACCOUNT_NAME":"TERTIARY_ACCOUNT_2","MARKET_VALUE":10,"OVERALL_MARKET_VALUE":5},{"MASTER_ACCOUNT_NAME":"SECOND_ENTITY","SUB_ACCOUNT_NAME":null,"TERTIARY_ACCOUNT_NAME":null,"MARKET_VALUE":6,"OVERALL_MARKET_VALUE":1},{"MASTER_ACCOUNT_NAME":"SECOND_ENTITY","SUB_ACCOUNT_NAME":"MAIN_ACCOUNT","TERTIARY_ACCOUNT_NAME":null,"MARKET_VALUE":1,"OVERALL_MARKET_VALUE":8},{"MASTER_ACCOUNT_NAME":"SECOND_ENTITY","SUB_ACCOUNT_NAME":"MAIN_ACCOUNT","TERTIARY_ACCOUNT_NAME":"TERTIARY_ACCOUNT_1","MARKET_VALUE":10,"OVERALL_MARKET_VALUE":5},{"MASTER_ACCOUNT_NAME":"SECOND_ENTITY","SUB_ACCOUNT_NAME":"MAIN_ACCOUNT","TERTIARY_ACCOUNT_NAME":"TERTIARY_ACCOUNT_2","MARKET_VALUE":5,"OVERALL_MARKET_VALUE":3},{"MASTER_ACCOUNT_NAME":"SECOND_ENTITY","SUB_ACCOUNT_NAME":"SECOND_ACCOUNT","TERTIARY_ACCOUNT_NAME":null,"MARKET_VALUE":5,"OVERALL_MARKET_VALUE":10},{"MASTER_ACCOUNT_NAME":"SECOND_ENTITY","SUB_ACCOUNT_NAME":"SECOND_ACCOUNT","TERTIARY_ACCOUNT_NAME":"TERTIARY_ACCOUNT_1","MARKET_VALUE":6,"OVERALL_MARKET_VALUE":1},{"MASTER_ACCOUNT_NAME":"SECOND_ENTITY","SUB_ACCOUNT_NAME":"SECOND_ACCOUNT","TERTIARY_ACCOUNT_NAME":"TERTIARY_ACCOUNT_2","MARKET_VALUE":10,"OVERALL_MARKET_VALUE":5}] const result = [] const levels = [ 'MASTER_ACCOUNT_NAME', 'SUB_ACCOUNT_NAME', 'TERTIARY_ACCOUNT_NAME' ] data.reduce((r, e) => { let value = {...e, children: [] } let level = levels.length while (level--) { if (e[levels[level]]) { r[level + 1] = value.children r[level].push(value) break } } return r; }, [result]) console.log(result)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM