2014-01-20 98 views
1

我有一個需要轉換爲json格式的列表。將對象列表轉換爲json樹結構

這..

var sourceList = [ 
    { title: "item-1", indent: "0" }, 
    { title: "item-2", indent: "0" }, 
    { title: "item-3", indent: "0", folder: true }, 
    { title: "item-4", indent: "1" }, 
    { title: "item-5", indent: "1", folder: true }, 
    { title: "item-6", indent: "2" }, 
    { title: "item-7", indent: "2" }, 
    { title: "item-8", indent: "0" } 
]; 

此..

var targetJson = [ 
    { title: "item-1" }, 
    { title: "item-2" }, 
    { title: "item-3", folder: true, children: [ 
     { title: "item-4" }, 
     { title: "item-5", folder: true, children: [ 
      { title: "item-6" }, 
      { title: "item-7" } 
     ]}, 
    ]}, 
    { title: "item-8" } 
]; 

使得結果可被用於初始化的樹結構等的下方。

item-1 
    item-2 
    item-3 
    .. item-4 
    .. item-5 
    .... item-6 
    .... item-7 
    item-8 

每個源對象的'indent'屬性決定了它相對於前一個對象的位置。

就像一個對象的縮進比前一個更大,那麼它將被視爲前一個孩子,如果它與之前的縮進相同,那麼它將被視爲前一個的兄弟。 因此,對於具有子項目的節點而言,兒童財產和文件夾屬性將發生。

其中一個挑戰是'第8項',它在0級比前一級在2級。

需要一個解決方案,最好在JavaScript中。

回答

2

我不停地縮進和元素之間的映射給孩子添加到:

// test data 
var sourceList = [ 
    { title: "item-1", indent: "0" }, 
    { title: "item-2", indent: "0" }, 
    { title: "item-3", indent: "0", folder: true }, 
    { title: "item-4", indent: "1" }, 
    { title: "item-5", indent: "1", folder: true }, 
    { title: "item-6", indent: "2" }, 
    { title: "item-7", indent: "2" }, 
    { title: "item-8", indent: "0" } 
]; 

// init 
var targetJson = []; 
var roots = { 0 : targetJson}; 

// actual code: 
sourceList.forEach(function(item){ 
    if (!roots[item.indent].splice) { 
    roots[item.indent] = roots[item.indent].children = []; 
    } 
    roots[item.indent].push(item); 
    if (item.folder) { 
    roots[+item.indent+1] = item; 
    } 
}); 

// output 
console.log(targetJson); 

PS:我不停的indent屬性的對象,所以你可以檢查結果。添加項目後,隨意將其刪除。這是無關緊要的。

+0

不錯..這就像一個魅力工作。 – Bibin