array.sort()在JavaScript中并不是简单的数字排序

1,519 阅读3分钟

在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 ,因此58 之前)。
  • 如果a > b - 该函数返回1 ,将b 放在a 之前(例如10 > 3 ,因此310 之前)。
  • 如果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) ,它是对数字数组进行排序的最短方法之一。

测验:你会如何对数字进行降序排序?请在下面的评论中写下你的答案!