0
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
4

3 に答える 3

2

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。

于 2012-08-17T12:01:58.773 に答える
1

一目でわかるのは

var multipleSortReversedIterator = function(item) {
    return -[item.a, item.b]; // will return NaN
    // change to return [-item.a, -item.b];
}; 
于 2012-08-17T10:59:17.607 に答える
1

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();

ただし、underscorejsを使用したソリューションは引き続き役立ちます。@cuzzaeから提案された[-item.a、-item.b]は、必要に応じて、逆ではなく、間違った順序でアイテムを返すと思います。

于 2012-08-17T11:29:43.930 に答える