2014-12-03 121 views
1

我開始出具有平坦JSON輸入本身(簡單的例子):Javascript:解析和排序扁平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對象。

嵌套深度可以是任何東西,因爲數據很可能來自具有上述扁平結構的數據庫表。

有什麼想法?

+0

看看jquery.map – 2014-12-03 20:15:48

+0

[這個答案](http://stackoverflow.com/a/17849353)給了我正是我需要做到這一點。 – melicent 2015-06-04 22:24:11

+0

請了解JSON是什麼以及它不是什麼。 *有什麼想法?*是的,我的想法是,你需要編寫一個「計算機程序」來做到這一點。 – 2016-08-17 05:22:41

回答

1

我會做如下工作。我本來可以使用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);

另外,sort階段不會是必要的,如果你想向孩子們在收到他們的父母的children數組屬性對象的方式。

+0

我當然希望我永遠不要終止維護代碼。 – 2016-08-17 05:24:31

1

我們的計劃是將父母下的孩子移到一個新的數組值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);

排序將被留作練習。