在JavaScript中,array.sort() 方法对数组进行排序。让我们用它来排序一些数字。
javascript
const numbers = [10, 5, 11];
numbers.sort(); // => [10, 11, 5]
嗯......numbers.sort() 返回[10, 11, 5] - 这看起来并不像一个按升序排序的数组。
为什么array.sort() 方法,在没有参数的情况下被调用时,不能像预期的那样对数字进行排序?让我们来寻找答案。
1.*array.sort()*不带参数
array.sort() 是一个关于数组实例的方法,它对数组进行就地排序(突变原始数组)并返回排序后的数组。
当调用不带参数的方法时,数组项被转化为字符串并按字母顺序排序......。
例如,让我们对一个名字的数组进行排序。
javascript
const names = ['joker', 'batman', 'catwoman'];
names.sort(); // => ['batman', 'catwoman', 'joker']
名字按字母顺序排序:['batman', 'catwoman', 'joker'] 。
不幸的是,在数字上调用该方法也会执行同样的字母排序。
javascript
const numbers = [10, 5, 11];
numbers.sort(); // => [10, 11, 5]
该方法返回数组[10, 11, 5] ,数字按字母顺序排序,而不是按数字值排序。
2.带有比较器的array.sort()
幸运的是,array.sort() 方法接受一个可选的参数:比较器函数。
javascript
const mutatedArray = array.sort([comparator]);
使用这个函数,你可以在排序过程中控制元素在数组中的排列方式。
如果comparator(a, b) 返回。
- 一个负数
< 0: 那么a就被放在前面。b - 一个正数
> 0: 那么b就放在前面。a - 零
0: 那么比较元素的位置不会改变
为了正确地对数字进行升序排序,让我们使用下面的比较器函数。
javascript
const numbers = [10, 5, 11];
numbers.sort((a, b) => {
if (a < b) {
`return -1;`
}
if (a > b) {
`return 1;`
}
return 0;
}); // => [5, 10, 11]
numbers.sort(comparator) 现在正确地对数字进行排序: 。[5, 10, 11]
在一个以升序排序的数组中,较小的数字被置于较大的数字之前。这就是你在编码比较器函数时需要维护的属性。
- 如果
a < b- 该函数返回-1,将a放在b之前(例如5 < 8,因此5在8之前)。 - 如果
a > b- 该函数返回1,将b放在a之前(例如10 > 3,因此3在10之前)。 - 如果
a === b- 顺序不改变。
前面例子中的比较器函数比较长。幸运的是,它可以通过不同的参数来简化。
javascript
const numbers = [10, 5, 11];
numbers.sort((a, b) => a - b); // => [5, 10, 11]
(a, b) => a - b 是一个简短的比较器,用于对数字进行排序。我推荐这种形式来对JavaScript中的数字数组进行排序。
3.使用类型化数组进行排序
JavaScript中的类型化数组包含特定类型的元素,例如:UInt8 :8位无符号整数,Float64 :64位浮点数。这与普通数组不同,普通数组的元素可以是任何类型,甚至可以是混合类型。
类型化数组的好处是,其sort() 方法默认对数字进行升序排序。
在不使用比较器函数的情况下,对数字进行排序的一种特制方法是使用类型化数组。
javascript
const numbers = [10, 5, 11];
const sortedNumbers = [...new Float64Array(numbers).sort()];
sortedNumbers; // => [5, 10, 11]
new Float64Array(numbers) 创建一个类型化数组的实例,初始化的数字来自 数组。numbers
new Float64Array(numbers).sort() 将类型化数组中的数字按升序排序。注意,不需要一个比较器函数。
最后,扩散运算符[...new Float64Array(numbers).sort()] ,将排序后的数字从类型化数组中提取到一个普通数组中。
4.4.总结
array.sort() 在没有参数的情况下调用的方法是按字母顺序排列元素的。这就是为什么使用 来对数字进行升序排序是不可行的。array.sort()
但是你可以表示一个比较器函数array.sort(comparator) 来定制元素的排序方式。我推荐numbers.sort((a, b) => a - b) ,它是对数字数组进行排序的最短方法之一。
测验:你会如何对数字进行降序排序?请在下面的评论中写下你的答案!