JS基础--sort()方法的用法,参数以及排序原理

489 阅读2分钟

sort 默认排序

Array的sort()方法默认把所有元素先转换为String再排序,字符串根据ASCII码进行排序。

//看上去正常结果
['Google','Apple','Microsoft'].sort();//结果:['Apple','Google','Microsoft']

// apple排在了最后,因为小写字母a的ASCII码在大写字母之后。
['Google', 'apple', 'Microsoft'].sort(); // ['Google', 'Microsoft", 'apple'] 

//10'排在了'2'的前面,因为数字先转换为字符串再排序,字符'1'比字符'2'的ASCII码小[1,2,10,20].sort();//结果:[1,10,2,20]

sort 自定义排序

arr.sort([compareFunction]) compareFunction(比较函数): compareFunction 是一个可选参数,默认是ASCII码进行排序,如果指明了 compareFunction ,那么数组会按照调用该函数的返回值排序。
compareFunction有两个参数,即 a 和 b 是两个将要被比较的元素:
a<b 返回-1,那么 a 会被排列到 b 之前;
a==b 返回 0,那么 a 和 b 的相对位置不变。
a>b 返回 1,那么 b 会被排列到 a 之前。
总结:返回结果为正数时才交换两个值的顺序,否则不交换

示例

比较数字从小到大排序

var arr = [10, 20, 1, 2];
//写法1
arr.sort(function (a, b) {
    if (a < b) { 
        return -1;
    }
    if (a > b) {
        return 1;
    }
    return 0;
});


//写法2
arr.sort(function(a, b) {
  return a - b;
})

console.log(arr); // [1, 2, 10, 20]

比较数字从大到小排序

var arr = [10, 20, 1, 2];
//写法1
arr.sort(function (a, b) {
    if (a < b) {
        return 1;
    }
    if (a > b) {
        return -1;
    }
    return 0;
});


//写法2
arr.sort(function(a, b) {
    return b - a;
})

console.log(arr); // [20, 10, 2, 1]

字符串忽略大小写,按照字母序排序

var arr = ['Google', 'apple', 'Microsoft'];
    arr.sort(function(a,b){
        var a1=a.toUpperCase();//转换为大写
        var b1=b.toUpperCase();//转换为大写
        if(a1 < b1)
        {
            return -1;
        }
        if(a1 > b1)
        {
            return 1;
        }
        return 0;
    })
    console.log(arr);// ["apple", "Google", "Microsoft"]

对于非ASCII字符排序
当排序非 ASCII 字符的字符串(如包含类似 e, é, è, a, ä 等字符的字符串)。一些非英语语言的字符串需要使用 String.localeCompare。这个函数可以将函数排序到正确的顺序。

var items = ['réservé', 'premier', 'cliché', 'communiqué', 'café', 'adieu'];
items.sort(function (a, b) {
  return a.localeCompare(b);
});
// items is ['adieu', 'café', 'cliché', 'communiqué', 'premier', 'réservé']

参考:
www.liaoxuefeng.com/wiki/102291… 廖雪峰 JavaScript 教程 segmentfault.com/q/101000000… JS中重排序方法sort()和比较函数 developer.mozilla.org/zh-CN/docs/… MDN Array.prototype.sort()