当我使用
时$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": []
}
]
}
]
提前致谢。
答案 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)
答案 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');
}