2016-09-06 139 views
0

我想爲我的對象樹中的每個根對象排序子對象 - 我該怎麼做?遞歸排序樹

樹:

{ 
folder: { id: 1, name: 'root' }, 
children: [ 
    { 
    folder: { id: 2, parentId: 1, name: 'zzz' }, 
    children: [] 
    }, 
    { 
    element: { id: 1, name: 'aaa' }, 
    children: [] 
    } 
] 
} 

排序將交換文件夾和元素在這裏等,實際的樹要大得多,以更高的深度。我怎樣才能做到這一點?

我有一種算法,此樹找到的東西:

/** 
* searchFor { 
* type: '', 
* index: '', 
* value: '' 
* } 
*/ 
var search = function (data, searchFor) { 
    if (data[searchFor.type] != undefined && 
     data[searchFor.type][searchFor.index] == searchFor.value) { 
     return data; 
    } else if (data.children != null) { 
     var result = null; 
     for (var i = 0; result == null && i < data.children.length; i++) { 
      result = search(data.children[i], searchFor); 
     } 
     return result; 
    } 
    return null; 
}; 

但老實說,我不知道我怎麼能只是排序。我應該怎麼做?

我已經試過這樣的事情,但它不工作:

/** 
* sortBy { 
* type: '', 
* index: '', 
* order: '' // asc/desc 
* } 
*/ 
var sort = function (data, sortBy) { 
    if (data.children != null) { 
     // sort all children here, but how? 

     var result = null; 
     for (var i = 0; result == null && i < data.children.length; i++) { 
      result = search(data.children[i], sortBy); 
     } 
     return result; 
    } 
    return null; 
} 
+0

['data.children.sort(...)'(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort)? – Bergi

回答

0

這應該工作。

function sortTree(tree){ 
    tree.children.sort(function(a,b){ 
     if (a.folder !== undefined && b.folder === undefined) return -1; 
     if (a.folder === undefined && b.folder !== undefined) return 1; 
     a = a.folder === undefined ? a.element; 
     b = b.folder === undefined ? b.element; 
     if (a.name == b.name) return 0; 
     return a.name < b.name ? -1 : 1; 
    }); 
    for (i = 0; i < tree.children.length){ 
     sortTree(tree.children[i]) 
    } 
} 
+0

不要忘記'返回0',以防它們相等。 – Bergi