【问题标题】:Toggle array sort in Javascript (ascending to descending and vice versa)在Javascript中切换数组排序(升序到降序,反之亦然)
【发布时间】:2013-01-24 04:30:06
【问题描述】:

我正在像这样对我的数组进行排序:

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

但我不知道如何切换。

【问题讨论】:

  • 为什么会有这么多噪音? index 是什么?它总是零......

标签: javascript


【解决方案1】:

.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]

【讨论】:

  • 效率不高 - 每次切换,它都会在数组上遍历两次:一次用于升序排序,然后将其反转
【解决方案2】:

怎么样:

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.

【讨论】:

  • 您可以将函数分配给 Array.prototype.toggled_sort 以使 toggled_sort 可用于所有数组,而不是 array.toggled_sort。
  • 你能帮我处理一个这样的数组吗:[ "$55", "$110", "$101", "$89", "$75" ] ?
【解决方案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/

【讨论】:

    【解决方案4】:

    如果您确定数组已排序,则可以使用简单循环来反转顺序

    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 函数(顺便说一句,检查this 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;
    }
    

    【讨论】:

      【解决方案5】:
      //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;
       });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-12
        • 2012-10-14
        • 1970-01-01
        • 2021-09-28
        • 2015-08-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多