Js中数组的sort函数对数组某一项进行排序

与友交流时,被问到一道数组排序的题:

①:

[
    {key:1, value: '123123'},
    {key:2, value: '123'},
    {key:3, value: '12312'},
    {key:4, value: '123111112'},
    {key:5, value: '12312'},
    {key:6, value: '12311112'}
]

②:

[
    {key: 2, value: "123"},
    {key: 3, value: "12312"},
    {key: 5, value: "12312"},
    {key: 1, value: "123123"},
    {key: 6, value: "12311112"},
    {key: 4, value: "123111112"}
]

要求把①根据数组里的’value'字段变成②那样。
前一天下午跟着大哥作为陪同去面了一个小哥,中间小哥被问到sort里a-b是升序还是降序。然后看到这道题时就想到了sort排序,此篇作为小笔记

w3school上对于sort的定义和用法原话是:

sort() 方法用于对数组的元素进行排序。排序顺序可以是字母或数字,并按升序或降序。默认排序顺序为按字母升序。(注意:当数字是按字母顺序排列时"40"将排在"5"前面。使用数字排序,你必须通过一个函数作为参数来调用。函数指定数字是按照升序还是降序排列。这种方法会改变原始数组!)

语法:

array.sort(sortfunction)
参数sortfunction可选。必须是函数。
sortfunction接收两个参数,这两个参数决定升序还是降序:a-b则表示升序,b-a则表示降序

sortfunction如果带参数,参数是一个比较函数。比较2个值,返回一个数字。参数 a 和 b,其返回值如下:

若 a < b,则返回负数
若 a == b,则返回 0
若 a > b,则返回正数
所以当函数返回值为1的时候就交换两个数组项的顺序,否则就不交换。

API复习完了,我们来把题做完,根据哪一项排序,就取出这一项的值做对比就好:

arr.sort(function (a, b){
    var val1 = a.value;
    var val2 = b.value;
    return val1 - val2;
})

多条件排序也可以在sortfunction函数了进行多次判断,这是对number的排序,如果是对string,sort则会按照ASCII字符进行排序

sort函数对数字排序无效

有时候会遇到排序无效的问题:

let arr = [1,10, 15, 3,  5, 25, 3];
arr.sort(); 

你以为会输出: [1, 3, 3, 5, 10, 15, 25] ?
实际会输出:[1, 10, 15, 25, 3, 3, 5]

这是为什么呢,在源码里我们可以看到,sort方法会调用每个数组项的toString()方法

x = TO_STRING(x);
y = TO_STRING(y);

ASCII字符里,5和3大于10
解决办法呢,自己手动设置sort返回规则的函数作为sortfunction的参数传过:

let compare = function (a, b) {
    if (a < b) {
        return -1;
    } else if (a > b) {
        return 1;
    } else {
        return 0;
    }
}

这样就正常了。

最后给出一篇简友写的sort用的是什么排序算法的文:
https://www.jianshu.com/p/0ddbc3c8f683

你可能感兴趣的:(Js中数组的sort函数对数组某一项进行排序)