angularJS范围orderBy不对子项进行排序,只对父项进行排序

时间:2015-09-24 23:09:34

标签: angularjs angularjs-scope angularjs-filter

当我使用

$scope.data = $filter('orderBy')(data,'title');

父母是排序的,孩子不是。

如果我的阵列有孩子怎么办?我怎样才能订购父母和孩子?

我的阵列:

    data = [
      {
        "id": 1,
        "title": "abc",
        "items": [
          {
            "id": 3,
            "title": "abc2",
            "items": []
          },
          {
            "id": 4,
            "title": "abc1",
            "items": []
          }
        ]
      },
      {
        "id": 2,
        "title": "cde",
        "items": [
          {
            "id": 5,
            "title": "cde2",
            "items": []
          },
          {
            "id": 6,
            "title": "cde1",
            "items": []
          }
        ]
      }
    ]    

提前致谢。

3 个答案:

答案 0 :(得分:2)

它不应该对孩子的对象进行任何排序。 对于在子对象内进行排序,对您的项目进行排序'递归地,对于每个孩子,使用$ filter(' orderBy')或类似代码,使用您自己的自定义比较功能。

var orderByFieldName = 'title',
    childPropertyForSorting = 'items',
    s = function (a, b) {
        //Revise comparing function depends on direction of sorting and your wishes
        if (a[orderByFieldName] > b[orderByFieldName])
            return 1;
        if (a[orderByFieldName] < b[orderByFieldName])
            return -1;

        return 0;
    },
    f = function (o) {
        if (o.hasOwnProperty(childPropertyForSorting) && o[childPropertyForSorting] instanceof Array) {
            o[childPropertyForSorting].sort(s);
            o[childPropertyForSorting].forEach(f);
        }
    };

if (originalData instanceof Array) {
    originalData.sort(s);
    originalData.forEach(f);
}

答案 1 :(得分:1)

如果你只想在视图中使用

,我会建议你

data-ng-repeat =“数据中的项目| orderBy:'colum you want'”

Read more about it here

答案 2 :(得分:1)

原因是子级处于另一级别并且被视为该对象内的另一个键值对,您可以使用在for循环中使用的相同过滤器,它将循环每个数据数组项并对子项进行排序,如下所示: / p>

 //filter the parent level by title
 $scope.data = $filter('orderBy')(data,'title');
 //copy the sorted array in temp variable
 var temp = angular.copy($scope.data);
 //sort the children by title while aggregating each array item and then storing the output in $scope.
 for(var i=0;i<data.length;i++){
      $scope.data[i].items = $filter('orderBy')(temp[i].items,'title');
 }