数组的重排序方法reverse()和sort()

js数组中存在两个可以直接用来重排序的方法:reverse()和sort()。
reverse()方法比较简单,直接反转数组项的顺序:

var arr = [1, 3, 2, 4, 5];
arr.reverse();
console.log(arr); //[5, 4, 3, 2, 1];

reverse()比较经典的用法,反转字符串:

var str= "Hello World";
var result = str.split("").reverse().join("");
console.log(result); //dlroW olleH;

sort()方法则更加灵活一些,可以按升序或者降序排列数组。
github上v8/array.js源码 708行-738行:

function InnerArraySort(array, length, comparefn) {
  // In-place QuickSort algorithm.
  // For short (length <= 10) arrays, insertion sort is used for efficiency.

  if (!IS_CALLABLE(comparefn)) {
    comparefn = function (x, y) {
      if (x === y) return 0;
      if (%_IsSmi(x) && %_IsSmi(y)) {
        return %SmiLexicographicCompare(x, y);
      }
      x = TO_STRING(x);
      y = TO_STRING(y);
      if (x == y) return 0;
      else return x < y ? -1 : 1;
    };
  }
  function InsertionSort(a, from, to) {
    for (var i = from + 1; i < to; i++) {
      var element = a[i];
      for (var j = i - 1; j >= from; j--) {
        var tmp = a[j];
        var order = comparefn(tmp, element);
        if (order > 0) {
          a[j + 1] = tmp;
        } else {
          break;
        }
      }
      a[j + 1] = element;

  };

从源码可以看出,默认情况下,comparefn会将数组每一项转换成String类型,然后按照ASCII码顺序比较大小,并以升序排列:

var arr = [0, 1, 5, 10, 15];
arr.sort()
console.log(arr); //[0, 1, ,10, 15, 5];

值得注意的是,即使数组中的每一项都是Number类型,也会被转换成String类型比较大小,这显然不是我们要的效果,因此可以通过给sort()方法传入一个比较函数,来实现按数字大小排序。比较函数接收两个参数,为数组相邻的两个项。如果第一个参数应该位于第二个参数之前则应返回一个负数,两个参数相等则返回0,第一个参数应该位于第二个参数之后则返回一个正数。例如,如果数组需要按升序排列,则可以使用以下比较函数:

function comparefn(v1, v2) {
  if(v1 < v2) {
    return -1;
  } else if (v1 > v2) {
    return 1;
  } else {
    return 0;
  }
}

由于比较函数通过返回一个小于零、等于零或大于零的值来影响排序结果,因此对于数值类型或者其valueOf()方法会返回数值类型的对象类型,使用减法操作就可以适当地处理所有这些情况。

function compar(value1, value2) {
  return value2 - value1
}
上一篇:(转载)C++lambda表达式


下一篇:【bzoj 1414】对称的正方形 单调队列+manacher