![](/img/trans.png)
[英]JavaScript: Converting a flat array into a tree like structure without using `eval`
[英]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.