JavaScript数组排序:sort()与reverse()方法详解
本文详解JavaScript中数组排序的sort()与reverse()方法。默认sort()按字符串编码排序,需传入比较函数实现数值升序或降序。结合reverse()可轻松实现逆序,掌握自定义比较逻辑是处理复杂排序的关键。
本节内容主要介绍:
sort()与reverse()方法基础
1. 在JavaScript中,若调用sort()时未指定比较函数,系统默认会依据字符编码顺序进行升序排列。这意味着,若直接对数值数组调用该方法,得到的排序结果往往不符合数值大小的预期。
2. JavaScript提供的reverse()方法用于将数组中的元素顺序完全颠倒,实现逆序排列。
首先分析上述第一点。假设有一个数组arr=[1,6,3,7,9],执行arr.sort()后,数组顺序变为1,3,6,7,9,此时结果恰好符合数值升序,看似得到了预期结果。
接着观察另一个数组排序案例:arr=[3,1,16,34,30]。如果执行arr.sort(),是否还能得到我们期望的1,3,16,30,34呢?
实际执行后发现结果为:1,16,3,30,34,这显然不是我们想要的数值排序结果。实际上,sort方法在此处将数值当作字符串进行字典序排序,其结果与数组arr1=['3','1','16','34','30']的排序结果完全一致。
具体代码示例如下:
具体代码示例如下:
var arr=[3,1,16,34,30];
var arr1=['3','1','16','34','30'];
alert(arr.sort()); // 输出结果为:1,16,3,30,34
alert(arr1.sort()); // 输出结果为:1,16,3,30,34 数值排序与比较函数实现
那么,如果我们希望得到正确的数值排序结果:1,3,16,30,34,应当如何处理呢?
查阅JavaScript官方手册,相关说明如下:
定义和用法
sort() 方法的主要作用是对数组的元素进行排序操作。
语法
arrayObject.sort(sortby) 参数描述
sortby 可选参数。用于规定排序顺序,该参数必须是一个函数。
返回值
返回对原数组的引用。需要注意的是,数组是在原数组上进行排序操作,不会生成新的副本。
说明
如果在调用该方法时未使用参数,将按字母顺序(即字符编码顺序)对数组中的元素进行排序。更精确地说,系统会先将数组元素转换为字符串(如有必要),然后进行比较。
如果希望按照其他标准进行排序,就必须提供一个比较函数。该函数用于比较两个值,并返回一个数字来说明这两个值的相对顺序。比较函数应包含两个参数 a 和 b,其返回值规则如下:
若 a 小于 b,在排序后的数组中 a 应该出现在 b 之前,则返回一个小于 0 的值。
若 a 等于 b,则返回 0。
若 a 大于 b,则返回一个大于 0 的值。
=====================================
根据以上说明可知,若要实现数值排序,必须提供一个比较函数。常见的比较函数实现方式如下:
具体代码示例如下:
function sortArr(m,n){
if(m<n)
return -1;//当m小于n时,返回-1
else if(m>n)
return 1;//当m大于n时,返回1
else return 0;//当m等于n时,返回0
} 上述代码可以精简为以下两种常见形式:
具体代码示例如下:
function sortArr(m,n){
return m-n;
}具体代码示例如下:
function sortArr(m,n){
return m>n?1:(m<n?-1:0);
} 随后执行arr.sort(sortArr),可以发现得到了预期的结果:1,3,16,30,34。这表明数组已按照整型数值进行了升序排序。
实现数组降序排序
由此引出一个新问题:如果我们希望数组进行降序排序,该怎么做呢?
一种思路是修改sortArr函数的返回值逻辑:当m<n时返回正值,当m>n时返回负值,当m=n时返回0。这样即可实现降序排列。
另一种做法是编写两个独立的函数,分别处理升序和降序,然后根据实际需求调用相应的函数。
此外,我们还可以利用前文提到的reverse()方法轻松实现。即在完成升序排序后,再对数组调用reverse()方法进行逆序处理,从而达成数组降序排序的目的。
具体代码示例如下:
具体代码示例如下:
arr.sort(sortArr).reverse();总结:本文主要介绍了JavaScript中数组的排序机制。由于sort()默认按字符串编码排序,若要实现其他形式的规则排序(如数值排序),则需要自定义比较函数。
JS处理含Emoji或中文的字符串转数组乱码问题
2026-11-05 16:12:28
JS怎么使用展开运算符合并对象
2026-11-05 14:42:18
ES6+环境下判断JS对象为空的简洁写法
2026-11-05 12:12:23
怎么通过replacer函数自定义JS中JSON的格式化输出
2026-11-05 11:19:44
JS正则表达式基础:字面量与RegExp构造函数的区别及常用元字符
2026-11-05 11:16:58
