【问题标题】:Sorting trees recursively递归排序树
【发布时间】:2017-01-14 00:46:54
【问题描述】:

我想为对象树中的每个根对子项进行排序 - 我该怎么做?

树:

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

【问题讨论】:

标签: javascript algorithm sorting tree


【解决方案1】:

这应该可行。

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

【讨论】:

  • 不要忘记return 0,以防他们相等。
猜你喜欢
  • 2014-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-25
  • 1970-01-01
  • 2020-03-12
  • 2015-04-07
  • 2011-10-02
相关资源
最近更新 更多