本文详细介绍JavaScript中Array对象的sort方法。默认情况下,元素按ASCII字符顺序升序排列。通过传入自定义比较函数,可实现数值大小排序及类似SQL ORDER BY的多维多键值排序。文章分别演示了数字型多维数组通过直接相减返回值,以及字符型数据利用localeCompare方法进行多列排序的具体代码实现。
JavaScript数组排序基础
arrayobj.sort(sortfunction);
参数:sortFunction
可选参数。该参数指定用于确定元素顺序的函数名称。若省略此参数,数组元素将默认按照 ASCII 字符编码顺序进行升序排列。
sort 方法会对 Array 对象执行排序操作,且该过程在原数组上进行,不会创建新的 Array 对象副本。
若为 sortfunction 参数提供了自定义函数,该函数必须返回以下三种值之一:
负数:表示第一个参数小于第二个参数。
零:表示两个参数相等。
正数:表示第一个参数大于第二个参数。
上述方法适用于一维数组的简单排序,但若需实现类似 SQL 语句中 ORDER BY 的多键值排序,该如何操作?
多维数组的多键值排序逻辑稍复杂,但无需使用循环解决。其核心原理与一维排序一致,只需在比较函数中依次判断各列即可。
数字型多维数组多键值排序
数字类型:
以下示例演示如何将数字型多维数组按第5列、第9列、第3列的顺序进行排序,类似于 SQL 中的 ORDER BY col5, col9, col7。对于数字类型,可直接通过两个项目相减得到差值作为返回值。
代码如下:
<script language=javascript>
var myArray = new Array();
for(var i=0;i<10;i++ )...{
myArray[i]=new Array();
myArray[i][0]=Math.floor(Math.random()*10);
myArray[i]=Math.floor(Math.random()*10);
myArray[i]=Math.floor(Math.random()*10);
myArray[i]=Math.floor(Math.random()*10);
myArray[i]=Math.floor(Math.random()*10);
myArray[i]=Math.floor(Math.random()*10);
myArray[i]=Math.floor(Math.random()*10);
myArray[i]=Math.floor(Math.random()*10);
myArray[i]=Math.floor(Math.random()*10);
}
myArray.sort( function(x, y) ...{
return (x[0]==y[0])?((x==y)?(x-y):(x-y)):(x-y)
});
for(var i=0;i<myArray.length;i++ )...{
document.write(myArray[i].join(",") + "<br/>");
}
</script> 字符型多维数组排序实现
字符类型:
当处理字符类型时,sortFunction 中的项目不能像数字那样直接相减,需要调用
str1.localeCompare( str2 ) 方法进行比较,以满足返回值要求。以下是针对多维数组第1列和第2列进行排序的情况示例。
代码如下:
function sortFunction(array) ...{
return array.sort( function(x, y) ...{
return (x[0]==y[0])?(x.localeCompare(y)):(x[0].localeCompare(y[0]))
});
} 因此,arrayObject.sort( sortFunction ) 的排序功能十分强大,最终实现了类似 SQL 语句中 ORDER BY 的多键值排序功能。