无法在JavaScript中的多个字段上对对象进行排序(AngularJS)

时间:2014-08-05 00:51:23

标签: javascript angularjs sorting

示例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;
}

我不知道应该如何解决这个问题。请帮帮我!我长期坚持这个问题了!

示例http://jsfiddle.net/w38E8/4/

1 个答案:

答案 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;
});

在这里试试 http://jsfiddle.net/9W3bC/