使用JavaScript的sort方法对数字数组进行排序

来自菜鸟教程
跳转至:导航、​搜索

Array 原型上可用的 sort 方法允许您对数组的元素进行排序并控制应如何进行排序。 这篇文章的目的是向您解释为什么、为什么不以及 sort 方法在对 数字数组 进行排序时如何工作。

TL;DR — 使用:
myArray.sort((a, b) => a - b); 对数字数组进行升序排序


JavaScript 中的 Arrays 是由一组数据项组成的数据结构。 因为 Javascript 不是类型化语言,Javascript 数组可以包含不同类型的元素 - stringsnumbersundefined 等。 然而,让数组中的所有项目都具有相同类型通常是一个好主意。

可以对数组执行的许多操作之一是 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() 方法对数组进行排序:

  1. 按升序排列
  2. 将物品转换成字符串

为此,sort 方法对每个数组元素调用 String() 转换方法,然后比较等效的字符串以确定正确的顺序。

除了将项目作为字符串进行比较这一事实之外,这本来就是那么容易,它的项目排序就像它们是字符串而不是数字一样。 简而言之,大多数时候,使用没有回调方法的 sort 方法并不完全有效,因为 sort 没有按照我们期望的方式排序。 相反,需要明确地告诉它如何这样做——使用 回调函数

回调函数 或技术上的 比较函数 接收两个参数(按约定称为 ab)并应返回 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 1return -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 以及 shiftsplicereverse 和其他方法之一。 有关所有方法的更多信息,请参阅 如何在 JavaScript 中使用数组方法:Mutator Methods