JavaScript中sort函数

对数组的排序

1
2
let arr = [1,6,9,3,4,12];
console.log(arr.sort()) // [1, 12, 3, 4, 6, 9]

因为 sort 方法在对数组做排序时,把元素默认成字符串进行相互比较,因此需要添加一个辅助函数,然后 sort 就能根据返回值的情况对数组进行排序

1
2
3
4
5
6
7
8
9
10
11
let arr = [1,6,9,3,4,12];
function compare(a, b) {
if (a < b) {
return -1;
}
if (a > b) {
return 1;
}
return 0;
}
console.log(arr.sort(compare)); // [1, 3, 4, 6, 9, 12]

上面的方法可以简化为

1
2
let arr = [1,6,9,3,4,12];
console.log(arr.sort((a, b) => a - b)); // [1, 3, 4, 6, 9, 12]

对字符串的排序

1
2
let names = ['Ana','ana','john','John'];
console.log(names.sort()) // ["Ana", "John", "ana", "john"]

为什么会出现上面的结果呢?这是因为 JavaScript 在做字符比较的时候,是根据字符对应的 ASCII 值来比较的,例如 A、J、a、j 对应的 ASCII 值分别是 65、74、97、106,虽然 a 在字母表中是最靠前的,但 J 的 ASCII 值比 a 的小,所以排在了 a 前面。

加入 toLowerCase() 使其按照字母顺序排序

1
2
3
let names = ['Ana','ana','john','John'];
console.log(names.sort((a, b) => a.toLowerCase() - b.toLowerCase()))
//  ["Ana", "ana", "john", "John"]

使用 localeCompare() 可以使小写子母排在前面

1
2
3
let names = ['Ana','ana','john','John'];
console.log(names.sort((a, b) => a.localeCompare(b)))
//  ["ana", "Ana", "john", "John"]

自定义排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
const friends = [
{ name: 'John', age: 30 },
{ name: 'Ana', age: 20 },
{ name: 'Chris', age: 25 }
];
function comparePerson(a, b) {
if (a.age < b.age) {
return -1;
}
if (a.age > b.age) {
return 1;
}
return 0;
}
console.log(friends.sort(comparePerson));
// 0: {name: "Ana", age: 20}
// 1: { name: "Chris", age: 25 }
// 2: { name: "John", age: 30 }

简化一下

1
2
3
4
5
6
const friends = [
{ name: 'John', age: 30 },
{ name: 'Ana', age: 20 },
{ name: 'Chris', age: 25 }
];
console.log(friends.sort((a, b) => a.age - b.age));