6

私は次のように配列を並べ替えています:

array.sort((function(index) {
    return function(a, b){
        return (a[index] === b[index] ? 0 : (a[index] < b[index] ? -1 :1));
    };
})(0));

ご覧のとおり、昇順で並べ替えられています。

私の質問は、並べ替えを切り替えるにはどうすればよいですか?たとえば、すでに昇順の場合、降順で並べ替えるにはどうすればよいですか。その逆も同様です。

私は降順でソートすることを知っています私はこのようにコードを変更する必要があります:

array.sort((function(index) {
    return function(a, b) {
        return (a[index] === b[index] ? 0 : (a[index] < b[index] ? 1 :-1));
    };
})(0));

しかし、私は切り替える方法がわかりません。

4

5 に答える 5

12

.reverse()は常に配列の順序を逆にするので、切り替えると、yourSortedArray.reverse()を呼び出すことができます。

var myArray = [1, 5, 8, 4, 0, 3, 6];
myArray.sort(); //[0, 1, 3, 4, 5, 6, 8]
myArray.reverse(); //[8, 6, 5, 4, 3, 1, 0]
于 2017-08-11T10:18:01.617 に答える
6

どうですか:

var array = [ 2,4,7,12,1,5 ];

array.toggled_sort = function () {
    var self=this;
    this.asc=!this.asc;
    return this.sort(function (l, r) {
        return l > r ? (self.asc ? 1 : -1) : l < r ? (self.asc ? -1 : 1) : 0;
    });
};

array.toggled_sort(); // ==> [ 1,2,4,5,7,12 ]
array.toggled_sort(); // ==> [ 12,7,5,4,2,1 ]
array.toggled_sort(); // ==> [ 1,2,4,5,7,12 ]
array.toggled_sort(); // ==> [ 12,7,5,4,2,1 ]
// etc.
于 2013-10-16T00:06:15.883 に答える
3

あなたは正しい方向に進んでいました。トグルの状態を保存するために3番目のクロージャーが必要でした。

function fn(reversed){
    return function(){
        reversed = !reversed;
        return function(a,b){
            return (a==b ? 0 : a < b? -1 : 1) * (reversed ? -1 : 1);
        };
    };
};
// usage
var toggleSort = fn();
array.sort(toggleSort())

jsfiddle: http: //jsfiddle.net/8JMuj/1/

于 2013-01-24T06:55:47.290 に答える
2

配列がソートされていることが確実にわかっている場合は、単純なループを使用して順序を逆にすることができます

var l = array.length;
for(i=0; i< l / 2; i++) {
   var t = array[i];
   array[i] = array[l - 1 - i];
   array[l - 1 - i] = t;
}

より簡単な解決策は、reverse関数を使用することです(BTW、このSO Q&Aで、さまざまな反転アルゴリズムとそのパフォーマンスを確認してください)

配列の初期状態がわからない場合は、並べ替え順序を追跡する配列にカスタムプロパティを関連付けることをお勧めします。例えば、

function sortArray(a, isAscending) {
  var currentSort = a["my_sort_order"];
  if (typeof currentSort != 'boolean') {
     // assume it be unsorted, use sort alogorithm
     a.sort(function(a,b) { return isAscending ? a - b : b - a; }); // assuming numerical array, modify as per your needs
  } else if (currentSort != isAscending) {
     // sorted but in different order, reverse the order
     a.reverse(); // or use for loop
  }
  // set the sort order
  a["my_sort_order"] = isAscending ? true : false;
}
于 2013-01-24T04:42:21.553 に答える
0
//Array sort by its object property can be implemented as this where sortType variable is used as the toggle parameter

//sortElement is the object property can be used as variable if you  need to select the property that which is used for sorting

//日付プロパティで並べ替えるvar elem1Var = new Date(elem1[sortElement]);

//文字列プロパティで並べ替えるvar elem1Var =elem1[sortElement].toUpperCase();

var sortMethod = -1;
if(self.sortType == 'ASC'){
  sortMethod = 1;
}

dataArr.sort(function(elem1,elem2){
  var elem1Var = elem1[sortElement];
  var elem2Var = elem2[sortElement];

  if(elem1Var  < elem2Var){
       return -1*sortMethod;
  }

  if(elem1Var > elem2Var){
       return  1*sortMethod;
  }
  return 0;
 });
于 2021-06-28T13:57:42.920 に答える