与友交流时,被问到一道数组排序的题:
①:
[
{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