JavaScript .sort() 函数原理与对象数组排序实战

作者:半夏时间:2026-10-26 14:37:40浏览:318

本文详解JavaScript中.sort()函数的常见用法与底层原理。通过对比无参排序与传入比较函数的区别,解析参数a、b的返回值规则,并展示如何对包含name、age等字段的对象数组进行多条件排序,涵盖升序、降序及布尔值排序的实战案例。

.sort()函数基础用法与原理

这是.sort()函数最基础的调用方式。

//没有函数参数,按字符编码格式排序
var arr = [3,2,3,34,12,23,234,84,9];
arr.sort();

// 结果: 12,2,23,234,3,3,34,84,9
// 需要升序或者降序则需要传入一个函数参数
var arr = [3,2,3,34,12,23,234,84,9];
arr.sort(function (a, b) {
    return a - b;
});
// 结果:2,3,3,9,12,23,34,84,234

// 降序
var arr = [3,2,3,34,12,23,234,84,9];
arr.sort(function (a, b) {
    return b - a;
});

不过,你可能对其背后的执行逻辑存在疑问。

首先需要明确的是,传入.sort()方法的回调函数中,参数a和b具体代表什么。

sort()在执行排序时会遍历数组,以示例数组为例进行说明。

在遍历的第一步中,a的值为3,b的值为2。

在第二步遍历中,a变为2,b变为3。

到了第三步,a为3,b为34。

。。。。。。。

这类似于冒泡排序的过程,数组中的每个元素都会参与两两比较。

具体的排序规则如下,这是W3C规范中的定义:

若 a 小于 b,在排序后的数组中 a 应该出现在 b 之前,则返回一个小于 0 的值。 若 a 等于 b,则返回 0。 若 a 大于b,则返回一个大于 0 的值。

这意味着,在自定义的回调函数中,若希望a排在b前面,需返回一个小于0的数值。

若希望a排在b后面,则需返回一个大于0的数值。

遵循这一规则,即可完成数组元素的排序操作。

对象数组的高级排序实战

理解了上述原理后,我们可以进一步探索一些进阶用法。

接下来介绍针对对象数组的排序方法。

// 按age升序排列
var users =[
        { "name": "has",   "age": 17, "height": 165 },
        { "name": "saf",   "age": 20, "height": 172 },
        { "name": "gngh",  "age": 45, "height": 182 },
        { "name": "yjerw", "age": 42, "height": 156 },
        { "name": "cvb",   "age": 22, "height": 176 },
        { "name": "wetty", "age": 32, "height": 178 },
        { "name": "aDNY",  "age": 34, "height": 175 }
     ]
users.sort(function (a, b) {
    return a.age - b.age;
});
// 结果(升序):
/*
name:has age:17 height:165
name:saf age:20 height:172
name:cvb age:22 height:176
name:wetty age:32 height:178
name:aDNY age:34 height:175
name:yjerw age:42 height:156
name:gngh age:45 height:182
*/
// 按name排列
var users =[
        { "name": "has",   "age": 17, "height": 165 },
        { "name": "saf",   "age": 20, "height": 172 },
        { "name": "gngh",  "age": 45, "height": 182 },
        { "name": "yjerw", "age": 42, "height": 156 },
        { "name": "cvb",   "age": 22, "height": 176 },
        { "name": "wetty", "age": 32, "height": 178 },
        { "name": "aDNY",  "age": 34, "height": 175 }
     ]
var users.sort(function (a, b) {
    return a.name - b.name;
});
// 结果:
/*
name:aDNY age:34 height:175
name:cvb age:22 height:176
name:gngh age:45 height:182
name:has age:17 height:165
name:saf age:20 height:172
name:wetty age:32 height:178
name:yjerw age:42 height:156
*/
// 按布尔值排列
var users=[
        { "name": "has",   "age": 17, "height": 165, "state": true},
        { "name": "saf",   "age": 20, "height": 172, "state": false},
        { "name": "gngh",  "age": 45, "height": 182, "state": false },
        { "name": "yjerw", "age": 42, "height": 156, "state": true },
        { "name": "cvb",   "age": 22, "height": 176, "state": false },
        { "name": "wetty", "age": 32, "height": 178, "state": true },
        { "name": "aDNY",  "age": 34, "height": 175, "state": false }
     ]
users.sort(function (a, b) {
    return b.state- a.state;
});
//众所周知,true - false = 1 
//结果
/*
[
  { name: 'has', age: 17, height: 165, state: true },
  { name: 'yjerw', age: 42, height: 156, state: true },
  { name: 'wetty', age: 32, height: 178, state: true },
  { name: 'saf', age: 20, height: 172, state: false },
  { name: 'gngh', age: 45, height: 182, state: false },
  { name: 'cvb', age: 22, height: 176, state: false },
  { name: 'aDNY', age: 34, height: 175, state: false }
]
*/

总结

至此,关于JavaScript中.sort()函数的常见用法与进阶操作的介绍已结束。如需了解更多相关技巧,可查阅本站往期文章或继续阅读后续内容,感谢支持。

作者最新文章