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

等価である場合に 'return 0'を忘れないようにしてください。 – Bergi

関連する問題