2015-07-22 2 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

Смежные вопросы