众所周知,javascript中的sort方法可以实现排序,但是如果只是使用默认的方法,很难拿到理想的结果
默认用法:
const arr = [1, 3, 2, 12, 5, 9, 1]
arr.sort()
console.log('排列的信息', arr); // [1, 1, 12, 2, 3, 5, 9],可以看到结果并不是我们想要的,因为sort默认会将数组中内容转为字符串形式比较
可以看到,对于数组集合的排序,往往并不能得到我们想要的结果,因为sort默认会将数组中内容转为字符串形式比较。
所以需要实现自定义的排序,而刚好sort方法支持传入一个函数,若该函数返回负数,则说明当前值较小,排到前面,若为0,位置不变,若为大于0的数,则将当前值往后排。
对数字数组的排序
const arr = [1, 3, 2, 12, 5, 9, 1]
arr.sort((a, b) => a - b)
console.log(arr); // [1, 1, 2, 3, 5, 9, 11]
对象数组的排序
同理,对于对象数组,也可以根据对象中的具体内容进行自定义排序:
const arr2 = [
{value: 1, name: 'a'},
{value: 3, name: 'b'},
{value: 2, name: 'c'},
{value: -1, name: 'd'}
]
function compareNum(a, b) {
if (a.value - b.value < 0) {
return -1
} else if (a.value == b.value) {
return 0
} else {
return 1
}
}
arr2.sort(compareNum)
console.log(arr2);
上面的代码返回的数组将以value值从小到大排序
对字符串进行排序
当我们用默认方法对字符串进行排序时:
const arr = ['Anna', 'alice', 'bob', 'Bob', 'back']
console.log('默认排序', arr3.sort());
得到的结果是:[‘Anna’, ‘Bob’, ‘alice’, ‘back’, ‘bob’]
因为sort()方法比较字符串的时候,其实是比较字符串对应的ASCII码。B对应的ASCII码是66,而a对应的是97。所以B会排在a的前面。那么这个时候我们就要传入自定义函数来比较了。
const arr = ['Anna', 'alice', 'bob', 'Bob', 'back']
arr.sort((a, b) => {
if (a.toLowerCase() < b.toLowerCase()) {
return -1
} else if (a.toLowerCase() === b.toLowerCase()) {
return 0
} else {
return 1
}
})
得到结果:[‘alice’, ‘Anna’, ‘back’, ‘Bob’, ‘bob’]
如果想要在首字母相同的情况下,小写字母的排在前面,则需要用到localeCompare方法:
const arr = ['Anna', 'alice', 'bob', 'Bob', 'back']
arr.sort((a, b) => a.localeCompare(b))
结果为:[‘alice’, ‘Anna’, ‘back’, ‘bob’, ‘Bob’]