2016-09-06 140 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