Javascript基于排序属性对树级别进行排序

时间:2016-06-15 12:03:01

标签: javascript sorting object tree

给定是一个对象(json)树,其中不同级别上的节点可能包含也可能不包含" sort"属性,像这样:

...
"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"
        }
...

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

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;

};

但我无法弄清楚如何在整个嵌套对象上应用此排序函数。任何提示或帮助都热烈赞赏。感谢。

1 个答案:

答案 0 :(得分:2)

嗨,我对未来的推荐感到满意,因为这个问题很有希望。你可以使用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的排序将作为父级,其他的将来自此。

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