【问题标题】:Keep object reference in recursive function在递归函数中保留对象引用
【发布时间】:2015-07-22 05:28:13
【问题描述】:

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

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

【问题讨论】:

    标签: javascript recursion tree lodash


    【解决方案1】:

    您可以使用 JavaScript 的内置 Array.prototype.sort 函数,它可以就地排序。它接受两个参数并执行比较。请注意,在 sortBy 键提取器中对 item.notes 进行排序是不合适的。

    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);
            });
    }
    

    【讨论】:

    • 稍作修改即可完美运行.forEach(function (node) { sortTree(node.nodes) });
    猜你喜欢
    • 1970-01-01
    • 2021-02-20
    • 2013-11-06
    • 2023-01-15
    • 2013-11-06
    • 1970-01-01
    • 2014-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多