簡體   English   中英

Javascript:將平面json結構解析並排序到嵌套數組中?

[英]Javascript: parsing and sorting a flat json structure into nested arrays?

我從這樣的平面JSON輸入開始(一個簡單的示例):

[
{id:1, value:'child1', parentId:2, sortOrder:1},
{id:2, value:'root1', parentId:null, sortOrder:1},
{id:3, value:'root2', parentId:null, sortOrder:2},
{id:4, value:'child2', parentId:1, sortOrder:2},
{id:5, value:'root3', parentId:null, sortOrder:3},
{id:6, value:'child1', parentId:2, sortOrder:1},
{id:7, value:'root4', parentId:null, sortOrder:4}
];

輸入可以是任意深度和長度,並且需要根據父子關系將其重新格式化為嵌套數組的集合,並在每個嵌套級別以升序排序。

本地JS或UnderscoreJS均可用於格式化輸出。

輸出將被格式化為具有基本形式的json結構:

root1 
  child1
  child2
root2
  child1
    child1
    child2
  child2

  etc...

其中每個元素都是一個JSON對象。

嵌套深度可以是任何值,因為數據很可能來自具有上述平面結構的db表。

有什么想法嗎?

我將按以下方式進行這項工作。 我本可以使用value屬性來附加嵌套的對象,但當時的問題尚不清楚。 相反,我創建了children屬性來構造嵌套結構。

 var flat = [ {id:1, value:'child1', parentId:2, sortOrder:1}, {id:2, value:'root1', parentId:null, sortOrder:1}, {id:3, value:'root2', parentId:null, sortOrder:2}, {id:4, value:'child2', parentId:1, sortOrder:2}, {id:5, value:'root3', parentId:null, sortOrder:3}, {id:6, value:'child1', parentId:2, sortOrder:1}, {id:7, value:'root4', parentId:null, sortOrder:4} ], lut = flat.sort((a,b) => a.sortOrder - b.sortOrder) .reduce((t,o) => { o.children === void 0 && (o.children = []); t[o.id] = t[o.id] === void 0 ? o : (o.children = t[o.id].children,o); o.parentId !== null && (t[o.parentId] !== void 0 ? t[o.parentId].children.push(o) : t[o.parentId] = {id: o.parentId, children: [o]}); return t; },{}), nested = Object.keys(lut).reduce((a,k) => lut[k].parentId === null ? a.concat(lut[k]): a,[]); console.log(nested); 

同樣,如果您希望將子對象放置在接收它們的父對象的children數組屬性中,則不需要sort階段。

我們的計划是將子級移到父級下(移到一個新的數組值的children屬性中),然后將其過濾掉。

 const flat = [ {id:1, value:'child1', parentId:2, sortOrder:1}, {id:2, value:'root1', parentId:null, sortOrder:1}, {id:3, value:'root2', parentId:null, sortOrder:2}, {id:4, value:'child2', parentId:1, sortOrder:2}, {id:5, value:'root3', parentId:null, sortOrder:3}, {id:6, value:'child1', parentId:2, sortOrder:1}, {id:7, value:'root4', parentId:null, sortOrder:4} ]; const nested = flat.filter((elt, idx, arr) => { const parent = arr.find(e => e.id === elt.parentId); if (!parent) return true; (parent.children = parent.children || []).push(elt); }); console.log(nested); 

排序將作為練習。

暫無
暫無

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

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