JavaScript数组排序sort()方法与对象数组排序详解

作者:函数茶馆

时间:2026-10-29

浏览:320

本文详细介绍JavaScript原生sort()方法的使用,包括默认字母排序与自定义比较函数的应用。重点讲解如何通过编写by函数实现对象数组的单字段及多字段(如先age后name)排序,提供完整代码示例与逻辑解析。

文章目录

JavaScript数组排序sort()基础用法

在JavaScript中,实现多维数组或对象数组的排序,核心依赖于原生的sort()方法,该方法专门用于对数组元素进行重新排列。

sort()方法的基本功能是数组元素排序,其标准语法格式如下:

arrayObject.sort(sortby)

该方法的返回值是对原数组的引用。需要特别注意,sort()操作直接在原数组上进行修改,不会生成新的副本数组。

若调用sort()时未传入任何参数,数组元素将按字符编码顺序(即字母顺序)进行排序。为确保比较准确,需先将所有元素转换为字符串形式。

若需依据其他标准排序,必须提供比较函数。该函数接收两个值进行比较,并返回一个数字以指示它们的相对顺序。比较函数通常包含两个参数a和b,其返回值规则如下:

当a小于b时,排序后a应位于b之前,函数需返回小于0的值;当a等于b时,返回0;当a大于b时,函数需返回大于0的值。


function NumAscSort(a,b)
{
 return a - b;
}
function NumDescSort(a,b)
{
 return b - a;
}
var arr = new Array( 3600, 5010, 10100, 801); 
arr.sort(NumDescSort);
alert(arr);
arr.sort(NumAscSort);
alert(arr);

对象数组排序与多字段排序实现

sort(fun)接收一个排序规则函数,用于比较两个数字的大小。对象数组排序的原理与此一致。若无需比较数字大小,可采用如下方式:


var myarray=["Apple", "Banana", "Orange"]
myarray.sort()

直接调用sort()后,数组元素按字符编码顺序(即字母顺序)排序。针对对象数组排序,我们需要先构建一个生成比较函数的函数:


//by函数接受一个成员名字符串做为参数
//并返回一个可以用来对包含该成员的对象数组进行排序的比较函数
var by = function(name){
 return function(o, p){
   var a, b;
   if (typeof o === "object" && typeof p === "object" && o && p) {
     a = o[name];
     b = p[name];
     if (a === b) {
       return 0;
     }
     if (typeof a === typeof b) {
       return a < b ? -1 : 1;
     }
     return typeof a < typeof b ? -1 : 1;
   }
   else {
     throw ("error");
   }
 }
}

待排序的数组定义如下:


var employees=[]
employees[0]={name:"George", age:32, retiredate:"March 12, 2014"}
employees[1]={name:"Edward", age:17, retiredate:"June 2, 2023"}
employees[2]={name:"Christine", age:58, retiredate:"December 20, 2036"}
employees[3]={name:"Sarah", age:62, retiredate:"April 30, 2020"}

直接调用该函数进行排序:


employees.sort(by("age"));

至此,对象数组的基本排序功能已实现。若需实现多键值排序(例如先按age排序,age相同时再按name排序),可对by函数进行扩展,使其接受第二个参数。当主要键值相等时,调用另一个compare方法来决定最终顺序。


//by函数接受一个成员名字符串和一个可选的次要比较函数做为参数
//并返回一个可以用来包含该成员的对象数组进行排序的比较函数
//当o[age] 和 p[age] 相等时,次要比较函数被用来决出高下
var by = function(name,minor){
 return function(o,p){
   var a,b;
   if(o && p && typeof o === 'object' && typeof p ==='object'){
     a = o[name];
     b = p[name];
     if(a === b){
       return typeof minor === 'function' ? minor(o,p):0;
     }
     if(typeof a === typeof b){
       return a < b ? -1:1;
     }
     return typeof a < typeof b ? -1 : 1;
   }else{
     thro("error");
   }
 }
}

employees.sort(by('age',by('name')));

现在可以放心使用。如果理解有困难,可直接复制该by函数到应用中调用即可。

实用工具推荐

电子包浆

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

使用 ›
图片压缩

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

使用 ›
相关文章