2015-07-22 56 views
0

我有一個應用程序,其中的對象用於顯示用戶系統上文件的樹視圖。它的結構是這樣的:在遞歸函數中保留對象引用

[{ 
    text: 'C:/', 
    type: 'dir', 
    nodes: [ 
     { 
     text: 'foo', 
     type: 'dir', 
     nodes: [] // And so on 
     }, 
     { 
     text: 'bar', 
     type: 'file' 
     } 
}] 

按照約定,我想要先顯示目錄,然後再顯示文件。不幸的是,無論項目類型如何,我的數據都按字母順序檢索。

爲了解決這個問題我寫了一個漂亮的遞歸函數

var sort = function (subtree) 
{ 
    subtree = _.sortBy(subtree, function (item) 
    { 
     if (item.nodes) 
     { 
     sort(item.nodes) 
     } 
     return item.type 
    }); 
} 

var tree = someTreeData; 
sort(tree); 

我使用lodash字母順序按文件類型排序每個nodes陣列。不幸的是,子樹似乎並沒有引用樹對象,因爲當我登錄其輸出時,它仍然未排序。我該如何補救?

回答

2

您可以使用JavaScript內置的Array.prototype.sort函數進行排序。它接受兩個參數並進行比較。請注意,排序item.notes裏面的sortBy鍵提取器是不合適的。

function isDirectory(node) { 
    return !!node.nodes; 
} 

function sortTree(subtree) { 
    subtree.sort(function (a, b) { 
     return a.type < b.type ? -1 : 
       a.type > b.type ? 1 : 0; 
    }); 

    subtree 
     .filter(isDirectory) 
     .forEach(function (node) { 
      sortTree(node.nodes); 
     }); 
} 
+0

工作完美,只需稍作修改''.forEach(function(node){sortTree(node.nodes)});''' – Harangue