JS中的排序让我感到非常困惑,请帮忙解答。

3

今天我在编写一些代码时,我意识到我不能够进行以下操作:

x.push(5, 9).sort(); //错误的写法 x.sort(x.push(5, 9)); //错误的写法

而需要进行以下操作:

x.push(5, 9);
x.sort();

我在想有没有办法把它变成一行? 此外,以下两行之间有什么区别?
x.sort((a, b) => a - b);
x.sort();
2个回答

3

.push 方法返回的是数组新的长度而不是变异后的数组。如果你想要同时执行推入(push) 和排序(sort),可以考虑创建一个新的数组,然后对其进行排序。

const sortedArr = [...arr, 5, 9].sort();
// or, .sort((a, b) => a - b)

.sort() 没有参数时,它将按字典序比较每个数组项进行排序,结果可能不太直观,例如:[1, 11, 2]

自定义回调函数可以让你自定义行为 - 当将数组元素与另一个元素进行比较时,回调函数被调用,返回值是负数、正数或0决定这两个元素在其他元素的相对位置上是否需要排序。因此,当对数字数组进行数值排序时,总是要使用像 (a, b) => a - b 这样的函数。


快速问题,如果我们正在比较负整数,使用字典排序或sort((a, b) => a - b)是否有影响? - Yujin Dong
1
是的,[-11, -2, -1, 0, 1, 2, 11].sort() 的结果是 [-1, -11, -2, 0, 1, 11, 2],这并不理想。 - CertainPerformance
这些是负数。 - Yujin Dong
是的,有些是负数。使用.sort()在对数字进行排序时无法正常工作,无论这些数字是正数还是负数。 - CertainPerformance
负数排序方式不同,但字典序仍然是错误的。例如 [-20,-11,0,2,11].sort() //=> [ -11, -20, 0, 11, 2 ] - Mark Reed

1

另一种在一行中进行推送和排序的方法是使用concat创建一个新数组,然后对其进行排序:

const arr = [1, 6, 10]
const sortedArr = arr.concat([5, 9]).sort((a, b) => a - b)

console.log(sortedArr)

正如@CertainPerformance已经指出的那样,您必须使用回调函数来正确地将数字值排序,因为将数字作为字符串进行排序会产生不正确的结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接