Javascript 在递归函数中保持对象引用

Javascript 在递归函数中保持对象引用,javascript,recursion,tree,lodash,Javascript,Recursion,Tree,Lodash,我有一个应用程序,其中一个对象用于显示用户系统上文件的树视图。它的结构是这样的: [{ text: 'C:/', type: 'dir', nodes: [ { text: 'foo', type: 'dir', nodes: [] // And so on }, { text: 'bar', type: 'file' } }] 按照惯例,

我有一个应用程序,其中一个对象用于显示用户系统上文件的树视图。它的结构是这样的:

[{
   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按文件类型按字母顺序对每个
节点
数组进行排序。不幸的是,子树似乎没有引用树对象,因为当我记录其输出时,它仍然未排序。如何解决这个问题?

您可以使用JavaScript内置的
Array.prototype.sort
函数进行排序。它接受两个参数并执行比较。请注意,在
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);
        });
}
函数isDirectory(节点){
return!!node.nodes;
}
函数排序树(子树){
子树排序(函数(a,b){
返回a.typeb型?1:0;
});
子树
.filter(isDirectory)
.forEach(函数(节点){
sortTree(node.nodes);
});
}

只需稍加修改即可完美工作
.forEach(函数(节点){sortTree(节点)节点)}