Array.prototype.sort()和Array.prototype.reverse()

Array.prototype.sort()

sort()对数组元素进行排序然后返回数组,不一定是稳定的。默认排序顺序是根据字符串Unicode码点。

还可以传入一个排序算法的函数,用自定义的方式排序。

此方法会改变数组自身。

var numbers = [4, 2, 5, 1, 3];
numbers.sort(function(a, b) {
  return a - b;
});
console.log(numbers);

也可以写成:
var numbers = [4, 2, 5, 1, 3]; 
numbers.sort((a, b) => a - b); 
console.log(numbers);

// [1, 2, 3, 4, 5]

因为默认排序顺序是根据字符串unicode,所以如果不使用排序函数去对一个数字的数组排序,那么首先会把数字转换成字符串然后再排序,这样结果就不准确了,所以如果要对数字数组排序必须使用排序函数。

使用映射改善排序

compareFunction 可能需要对元素做多次映射以实现排序,尤其当 compareFunction 较为复杂,且元素较多的时候,某些 compareFunction 可能会导致很高的负载。使用 map 辅助排序将会是一个好主意。基本思想是首先将数组中的每个元素比较的实际值取出来,排序后再将数组恢复。

// 需要被排序的数组
var list = ['Delta', 'alpha', 'CHARLIE', 'bravo'];

// 对需要排序的数字和位置的临时存储
var mapped = list.map(function(el, i) {
  return { index: i, value: el.toLowerCase() };
})

// 按照多个值排序数组
mapped.sort(function(a, b) {
  return +(a.value > b.value) || +(a.value === b.value) - 1;
  //如果+(a.value > b.value)为真,||后面的就不执行了
});

// 根据索引得到排序的结果
var result = mapped.map(function(el){
  return list[el.index];
});

 Array.prototype.reverse()

reverse()方法将数组中元素的位置颠倒。

此方法会改变数组自身。

var myArray = ['one', 'two', 'three'];
myArray.reverse(); 

console.log(myArray) // ['three', 'two', 'one']

自己实现简单的reverse():

Array.prototype.reverse = function () {
    for (var i = 0, temp; i < this.length / 2; i++) {
        temp = this[i];
        this[i] = this[this.length - 1 -i];
        this[this.length - 1 - i] = temp
    }
    return this;
}    

 

posted @ 2018-06-20 15:29  hahazexia  阅读(397)  评论(0)    收藏  举报