JavaScript排序算法不起作用 - 我做错了什么明显吗?


function MyController($scope) {
    var singleSort = [
        { "text": "Second", "a": 2 },
        { "text": "Fifth", "a": 5 },
        { "text": "First", "a": 1 },
        { "text": "Fourth", "a": 4 },
        { "text": "Third", "a": 3 }
    ];    
    var multipleSort = [
        { "text": "Second", "a": 1, "b": 2 },
        { "text": "Fifth", "a": 2, "b": 2 },
        { "text": "First", "a": 1, "b": 1 },
        { "text": "Fourth", "a": 2, "b": 1 },
        { "text": "Third", "a": 1, "b": 3 }
    ];
    var singleSortIterator = function(item) {
        return item.a;
    };    
    var multipleSortIterator = function(item) {
        return [item.a, item.b];
    };
    var singleSortReversedIterator = function(item) {
        return -item.a;
    };    
    var multipleSortReversedIterator = function(item) {
        return -[item.a, item.b];
    };    
    $scope.singleSort = _.sortBy(singleSort, singleSortIterator);     
    $scope.multipleSort = _.sortBy(multipleSort, multipleSortIterator);   
    $scope.singleSortReversed = _.sortBy(singleSort, singleSortReversedIterator);     
    $scope.multipleSortReversed = _.sortBy(multipleSort, multipleSortReversedIterator);   
}

排序算法除了 multipleSortReversed 之外都在工作。这里有什么明显的问题吗?

http://jsfiddle.net/andybooth/QEBUx/

我得到的结果是

Single sort
First
Second
Third
Fourth
Fifth
Multiple sort
First
Second
Third
Fourth
Fifth
Single sort (reversed)
Fifth
Fourth
Third
Second
First
Multiple sort (reversed)
Second
Fifth
First
Fourth
Third

我不认为 uderscore 可以按多个属性排序,但我使用普通的 javascript 排序函数实现了多重排序

var helper = function(x,y) {
  var r = 0;
  if(x.a > y.a) {r+=10;}
  if(x.a < y.a) {r-=10;}
  if(x.b > y.b) {r+=1;}
  if(x.b < y.b) {r-=1;}
  return r;
}
var asc = [{a:2,b:1},{a:1,b:2},{a:1,b:1},{a:2,b:2}].sort(function(x,y) {
  return helper(x,y);
});
var desc = [{a:2,b:1},{a:1,b:2},{a:1,b:1},{a:2,b:2}].sort(function(x,y) {
  return -1 * helper(x,y);
});

主要思想在助手中。您需要确保返回的值根据属性优先级排序按正确的顺序排列。可能的值:11,10,1,0,-1,-10,-11。

使用 http://linqjs.codeplex.com 似乎适用于多个排序 http://jsfiddle.net/andybooth/caQjf/。

$scope.singleSortReversed = Enumerable.From(singleSort).OrderByDescending(orderByA).ToArray();   
$scope.multipleSortReversed = Enumerable.From(multipleSort).OrderByDescending(orderByA).ThenByDescending(orderByB).ToArray();

但是,使用下划线的解决方案仍然有用。我相信@cuzzae建议的 [-item.a, -item.b] 仍然以错误的顺序返回项目,而不是按要求反转。

我一眼就能看到的是

var multipleSortReversedIterator = function(item) {
    return -[item.a, item.b]; // will return NaN
    // change to return [-item.a, -item.b];
}; 

最新更新