【问题标题】:Javascript sort tree levels based on sort attribute基于排序属性的Javascript排序树级别
【发布时间】:2016-10-16 12:55:10
【问题描述】:

Given 是一个对象 (json) 树,其中不同级别的节点可能包含也可能不包含“排序”属性,如下所示:

...
"Thomas": {
    "id": "4",
    "sort": "11"
    },
"Anna": {
    "sort": "10",
    "id": "9"
    },
"Christa": {
    "id": "13",
    "sort": "9",
    "activity" : {
        "book": "9",
        "sort": "8",
        "read": {
            "image": "9",
            "sort": "7"
            },
        "cook": {
            "image": "9",
            "sort": "6"
            }
        },
    "Peter": {
        "fish": "9",
        "sort": "5"
        }
...

我必须根据“排序”属性单独对所有级别进行排序,并且已经创建了一个工作函数来对单个对象节点进行排序(将对象转换为数组以进行排序,转换回来):

var sortObject = function(inObj) {

var outObj = {}, array = [], item = {};

// transform to array for sorting
array = $.map(inObj, function(value, key) {
    if($.type(value) == "object") {
       item = { nodename: key };
       for(var i in value) {
          item[i] = value[i];
       }
    } else {
        item = { [key]: value };
    }
    return item;
});

array.sort(function(a, b) {
    return a.sort - b.sort;
});

// transform back to object 
$.each(array, function(key, value) {
    if (value.hasOwnProperty("nodename")) {
        var item = {};
        for(var i in value) {
            if (i !== "nodename") {
            item[i] = value[i];
            }
        outObj[value["nodename"]] = item;    
        }
    } else {
        for(var i in value) {
            outObj[i] = value[i];    
        }
    }
});

return outObj;

};

我不知道如何在整个嵌套对象上应用这个排序函数。非常感谢任何提示或帮助。谢谢。

【问题讨论】:

  • 您无法对对象进行排序。您只能使用键和所有级别的键对数组进行排序。
  • 您无法对 JavaScript 对象进行排序,因为 property ordering is implementation defined.
  • 没有对Object 进行排序这样的事情。你需要对象数组。
  • 在呈现的函数中,我首先转换为数组,然后以新的顺序将其转换回来。
  • 到目前为止,这是有效的。但是如何将它应用到整棵树上呢?

标签: javascript sorting object tree


【解决方案1】:

您好,我正在回答这个问题以供将来参考,因为这个问题很有希望。您可以改用 Underscore.js 并使其变得简单。

 var arrayTreeSort = function (array, parent, tree) {
  try {
    var iValue = $scope.iValue + 1;
    tree = typeof tree !== 'undefined' ? tree : [];
    parent = typeof parent !== 'undefined' ? parent : {
      ROLE_SEQ: 0
    };
    var children = _.filter(array, function (child) {
      return child.ROLE_PARENT_SEQ == parent.ROLE_SEQ;
    });
    if (!_.isEmpty(children)) {
      if (parent.ROLE_SEQ == 0) {
        tree = children;
      } else {
        parent['sort'] = children
      }
      _.each(children, function (child) {
        var arrayTreeSort(array, child)
      });
    }
    return tree;
  } catch (err) {
    exceptionService.promiseRejectsAfterAWhile(err);
  }
};

var sortedArray = arrayTreeSort(unsortedArray);

将您的输入数组作为 arrayTreeSort() 函数的参数。它将排序后的数组返回给变量 sortedArray。

在函数内部,我静态地给了 sort 作为参数。在这里,值为 0 的排序将作为父排序,其他排序将在此排序。

我希望这会有所帮助。谢谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-17
    • 1970-01-01
    • 2020-01-29
    • 2019-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-09
    相关资源
    最近更新 更多