使用JavaScript的sort方法对数字数组进行排序
Array 原型上可用的 sort
方法允许您对数组的元素进行排序并控制应如何进行排序。 这篇文章的目的是向您解释为什么、为什么不以及 sort
方法在对 数字数组 进行排序时如何工作。
TL;DR — 使用:
myArray.sort((a, b) => a - b);
对数字数组进行升序排序
JavaScript 中的 Arrays 是由一组数据项组成的数据结构。 因为 Javascript 不是类型化语言,Javascript 数组可以包含不同类型的元素 - strings、numbers、undefined 等。 然而,让数组中的所有项目都具有相同类型通常是一个好主意。
可以对数组执行的许多操作之一是 sorting。 无论您是否需要了解一组成绩中最优秀的学生、华尔街的大赢家、您最近消耗了多少数据,这一切都涉及通过排序来组织一个集合。
在下面的代码示例中。 我们将在巢中收集一组鸡蛋,然后按升序和降序对它们进行排序。 准备好? 我们开始做吧!
填充数组
我们声明并初始化一个 nest
数组并用 null
值预填充它 - 目前:
let eggsInNest = new Array(10).fill(null);
我们使用 Array
构造方法中可用的静态 fill 方法。 接下来,让我们用 1 - 200 的随机值填充 10 个元素:
eggsInNest = eggsInNest.map(() => (Math.floor(Math.random() * 200) + 1));
排序
然后我们可以简单地通过在我们的数组上调用 sort
方法来进行排序,而不需要参数:
eggsInNest.sort(); // e.g.: [109, 136, 156, 188, 19, 190, 2, 34, 55, 90]
如您所见,有一个小问题,排序并没有像您预期的那样工作。 继续阅读以了解为什么以及如何解决它。
默认情况下 sort()
方法对数组进行排序:
- 按升序排列
- 将物品转换成字符串
为此,sort
方法对每个数组元素调用 String()
转换方法,然后比较等效的字符串以确定正确的顺序。
除了将项目作为字符串进行比较这一事实之外,这本来就是那么容易,它的项目排序就像它们是字符串而不是数字一样。 简而言之,大多数时候,使用没有回调方法的 sort
方法并不完全有效,因为 sort
没有按照我们期望的方式排序。 相反,需要明确地告诉它如何这样做——使用 回调函数 。
回调函数 或技术上的 比较函数 接收两个参数(按约定称为 a
和 b
)并应返回 1[ X170X] 如果第一个参数应该在第二个之前,-1 如果第二个参数应该在第一个之前和 0 如果它们相等。 哇! 😓
让我们创建一个 sortEggsInNest
比较函数:
function sortEggsInNest(a, b) { if (a > b) { return 1; } else if (b > a) { return -1; } else { return 0; } }
如果你想成为一个能手😎,你可以用一个三元运算符来减少 sortEggsInNest
比较函数,如下所示:
function sortEggsInNest(a, b) { return a > b ? 1 : b > a ? -1 : 0; }
然后我们可以再次调用 sort
方法,但这次传入 sortEggsInNest
比较函数:
eggsInNest.sort(sortEggsInNest);
是的,它有效……按升序排列。
降序
需要降序排序吗? 只需将比较函数中的 return 1 与 return -1 交换,如下所示:
function sortEggsInNest(a, b) { if (a > b) { return -1;; } else if (b > a) { return 1;; } else { return 0; } }
或者,使用三元运算符的简短版本:
function sortEggsInNest(a, b) { return a > b ? -1 : b > a ? 1 : 0; }
用数字更短的方法
最后,还有更短的方法来编写比较函数。 这里:
eggsInNest.sort((a, b) => a - b);
这没关系,因为比较函数只返回 1、-1 或 0。 减去这两个中间值就可以得到准确的结果。 但是请记住 - 这只能用于数字类型或 valueOf()
方法返回数值的对象(例如 Date 对象)。
延伸阅读
sort
是许多 Array Mutator Methods 以及 shift
、splice
、reverse
和其他方法之一。 有关所有方法的更多信息,请参阅 如何在 JavaScript 中使用数组方法:Mutator Methods