示例:http://jsfiddle.net/w38E8/4/
请查看以上示例。
控制器:
function SortCtrl($scope) {
$scope.students = [{
'name': 'AAA',
'year': 'sophomore',
'score': 100,
}, {
'name': 'ABA',
'year': 'freshman',
'score': 70,
}, {
'name': 'ABC',
'year': 'freshman',
'score': 30,
}, {
'name': 'BAA',
'year': 'junior',
'score': 90,
}, {
'name': 'BAB',
'year': 'junior',
'score': 70,
}, {
'name': 'BBA',
'year': 'junior',
'score': 50,
}, {
'name': 'CAA',
'year': 'sophomore',
'score': 30,
}, ];
$scope.sortArr = ['name']; // Sorts the students array by this
$scope.sortClass = function (field) { // asc:BLUE, desc:RED
var fieldIdx = getIndexInArray(field, $scope.sortArr);
if (fieldIdx > -1) {
return $scope.sortArr[fieldIdx].indexOf('-') > -1 ? 'desc' : 'asc';
}
return '';
};
$scope.changeSort = function (field, $event) { // When the header is clicked
var fieldIdx = getIndexInArray(field, $scope.sortArr);
if (fieldIdx > -1) {
if ($event.shiftKey) {
} else if ($scope.sortArr.length > 1) {
$scope.sortArr = [field];
fieldIdx = getIndexInArray(field, $scope.sortArr);
}
$scope.sortArr[fieldIdx] = $scope.sortArr[fieldIdx].indexOf('-') > -1 ? $scope.sortArr[fieldIdx].replace('-', '') : '-' + field;
} else {
if ($event.shiftKey) {
$scope.sortArr.push(field);
} else {
$scope.sortArr = [field];
}
}
var length = $scope.sortArr.length;
$scope.students.sort(function (a, b) {
var sortA = '';
var sortB = '';
var fieldA = '';
var fieldB = '';
for (var i = 0; i < length; i++) {
if (field == 'year') {
if (field == $scope.sortArr[i].replace('-', '')) {
fieldA += customOrder(a.year);
fieldB += customOrder(b.year);
} else {
sortA += customOrder(a.year);
sortB += customOrder(b.year);
}
} else {
if (field == $scope.sortArr[i].replace('-', '')) {
fieldA += a[$scope.sortArr[i].replace('-', '')];
fieldB += b[$scope.sortArr[i].replace('-', '')];
} else {
sortA += a[$scope.sortArr[i].replace('-', '')];
sortB += b[$scope.sortArr[i].replace('-', '')];
}
}
}
if (sortA != sortB) { // To sort multiple fields
if (sortA < sortB) return -1;
if (sortA > sortB) return 1;
return 0;
}
if ($scope.sortArr[getIndexInArray(field, $scope.sortArr)].indexOf('-') > -1) return fieldA == fieldB ? 0 : (fieldA < fieldB ? 1 : -1);
else return fieldA == fieldB ? 0 : (fieldA < fieldB ? -1 : 1);
});
};
function getIndexInArray(field, arr) {
var idx = -1;
angular.forEach(arr, function (value, index) {
if (field == value.replace('-', '')) {
idx = index;
}
});
return idx;
};
function customOrder(type) {
switch (type) {
case 'freshman':
return 0;
case 'sophomore':
return 1;
case 'junior':
return 2;
case 'senior':
return 3;
}
};
};
因此,示例显示您可以按 shift键对多个字段进行排序。此外,当您单击标题时,它每次都会更改顺序。
问题是我无法对对象进行排序,YEAR:DESC,然后名称:ASC。我错了什么?我很确定这部分是错的:
if (sortA != sortB) { // To sort multiple fields
if (sortA < sortB) return -1;
if (sortA > sortB) return 1;
return 0;
}
我不知道应该如何解决这个问题。请帮帮我!我长期坚持这个问题了!
答案 0 :(得分:2)
我想我已经开始工作了。
function ascF(a, b) { if(a < b) return -1; else if(a > b) return 1; else return 0;};
function descF(a, b) { if(a < b) return 1; else if(a > b) return -1; else return 0;};
var length = $scope.sortArr.length;
$scope.students.sort(function (a, b) {
for (var i = 0; i < length; i++) {
var field = $scope.sortArr[i],
sortF = ascF;
if(field.charAt(0) === "-") {
sortF = descF; field = field.substring(1);
}
if(field === "group") field = "score";
if(a[field] === b[field]) continue;
if(field === "year") return sortF(customOrder(a[field]), customOrder(b[field]));
else return sortF(a[field], b[field]);
}
return 0;
});