JavaScript 数组 sort() 方法详解:排序原理与自定义比较函数

作者:闭包旅人

时间:2026-10-29

浏览:492

本文详细解析 JavaScript 中数组 sort() 方法的用法。默认情况下,sort() 按字符编码顺序对元素进行字符串排序,这可能导致数字排序结果不符合预期。通过传入自定义比较函数,可以定义具体的排序规则,实现数字大小排序或其他复杂逻辑。文章包含具体代码示例,展示如何编写比较函数以及简化写法。

文章目录

sort() 方法语法与基本用法

语法格式为 arrayObject.sort(sortby)。其中参数 sortby 为可选参数,用于规定排序顺序,且必须是一个函数。

sort() 方法的主要功能是对数组的元素进行排序操作。

如果在调用该方法时未提供参数,数组元素将按字母顺序(更精确地说是字符编码的顺序)进行排序。要实现这一行为,

首先需要确保数组中的所有元素都转换为字符串(如有必要),以便进行字符串比较。

若希望按照其他标准进行排序,则必须提供一个比较函数。该函数负责比较两个值,并返回一个数字来说明这两个值的相对顺序。

比较函数应接收两个参数 a 和 b,其返回值规则如下:

如果 a 小于 b,在排序后的数组中 a 应排在 b 之前,此时函数应返回一个小于 0 的值。

如果 a 等于 b,则返回 0。

如果 a 大于 b,在排序后的数组中 a 应排在 b 之后,此时函数应返回一个大于 0 的值。

数字数组排序与比较函数

下面演示如何使用 JavaScript 中的 sort() 方法对数字数组进行排序。


<script>
  var arr = [23,12,1,34,116,8,18,37,56,50];
  alert(arr.sort();
</script>

返回结果:[1, 116, 12, 18, 23, 34, 37, 50, 56, 8]

上述代码并未按数值大小对数字进行正确排序。要实现按数值大小排序,必须使用一个自定义的比较函数:


<script>
  var arr = [23,12,1,34,116,8,18,37,56,50];
  function sequence(a,b){
    if (a>b) {
      return 1;
    }else if(a<b){
      return -1
    }else{
      return 0;
    }
  }
  console.log(arr.sort(sequence));
</script>

返回结果:[1, 8, 12, 18, 23, 34, 37, 50, 56, 116](排序正确)

当然,也可以将比较函数直接写在 sort() 方法内部:


<script>
  var arr = [23,12,1,34,116,8,18,37,56,50];
  var arr2 = arr.sort(function(a,b){
     if (a>b) {
      return 1;
    }else if(a<b){
      return -1
    }else{
      return 0;
    }  
  })
  console.log(arr2);
</script>

返回结果:[1, 8, 12, 18, 23, 34, 37, 50, 56, 116](同样正确)

还可以简化为以下写法: 这是因为:若 a 小于 b,在排序后的数组中 a 应该出现在 b 之前,则返回一个小于 0 的值。

若 a 等于 b,则返回 0。

若 a 大于 b,则返回一个大于 0 的值。


 <script>
   var arr = [23,12,1,34,116,8,18,37,56,50];
   function sequence(a,b){
     return a - b;
   }
   console.log(arr.sort(sequence));
 </script>

返回结果:[1, 8, 12, 18, 23, 34, 37, 50, 56, 116](结果正确)

字符串排序与简化写法

对于按字母顺序进行排序的情况,处理起来相对简单,直接使用 sort() 方法即可:


 <script>
   var arr = ['fanda','banner','find','zoom','index','width','javascript'];
   console.log(arr.sort());
 </script>

返回结果:["banner", "fanda", "find", "index", "javascript", "width", "zoom"]

排序原理与比较函数机制

在学习 JavaScript 过程中,发现 sort() 函数是一个比较特殊的存在(可能是个人理解有限)。在此记录一下相关知识点:sort() 方法的参数比较特殊,它必须是一个函数,但同时也是可选参数。如果不提供参数,默认会以字符串的字典顺序进行排列(即使元素是数值,也会被转换为字符串处理)。这个参数函数需要能够比较两个值的大小,例如:

代码如下:

function sortNumber(a, b){
return a - b; //这里返回的是它们的差值。如果差值小于 0,a 将排在前面;如果大于 0,b 将排在前面;如果是 0,则顺序不变(基于冒泡排序逻辑)。
}

应用示例如下(这是一个经典例子):


<script type="text/javascript">
function sortNumber(a,b){return a - b}
var arr = new Array(3)
arr[0] = "10";
arr[1] = "5";
arr[2] = "4";
document.write(arr + "<br />");
document.write(arr.sort(sortNumber));
</script>

原本排列是 10, 5, 4,排序后变为 4, 5, 10。这里说明一下这个过程:虽然 sortNumber 函数定义时有两个参数,但在调用时似乎没有显式传入参数,这是如何进行比较的呢?这是因为当 arr 从第一个数开始调用 sort 时,10 前面没有数与之比较,所以继续处理第二个数 5。此时 10 会与 5 比较,于是调用 sortNumber 并将 10 和 5 作为参数传入。这是 sort() 方法的内部特性。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章