JS数组sort()方法中的比较函数的理解。

本文详细介绍了JavaScript中数组的sort方法,包括比较函数的原理、参数a和b的含义以及返回值的规则。通过实例展示了如何实现升序和降序排序,特别是在处理对象数组时如何根据属性值进行排序。此外,还强调了比较函数返回正负数的意义,并提供了简洁的排序实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大家在学习sort方法中的比较函数时可能经常见到下面这种例子。

var points = [40,100,1,5,25,10];
points.sort(function(a,b){return a-b});

教程往往直接说返回 a - b 就是升序,b - a 就是降序。那么我们应该如何理解呢?

1. 比较函数参数 a, b 代表的含义

sort方法是对数组中的值进行冒泡排序,因此a, b便代表数组的两个相邻元素。

这里特别需要注意的是 a 代表后面一个元素,b 是前面的元素!!!

ab 不仅可以是数字,当数组元素是对象时,ab就是相邻的两个对象了,比如我们可以通过ab[属性]取到对象的属性值。

let arr = [
    {
        name: 'jack1',
        age: 12
    },
    {
        name: 'jack2',
        age: 24
    },
    {
        name: 'jack3',
        age: 11
    }
];
arr.sort((a, b) => {
	console.log(a.age);
	// 我们可以通过a,b取到对象的属性值
    return a.age - b.age
})

//output
24
11
11
11
这里我们也可以看到 a.age 第一个输出的是第二个元素的年龄属性,大家也可以自己验证b

2. 比较函数返回值的含义

冒泡排序,就是相邻两元素按照规则进行交换,那么如何判断是否需要交换呢,就取决于比较函数的返回值。

如果返回值 >0 即 正数: 我们可以将其看作 true,代表已经符合要求啦,不用交换

如果返回值 <0 即 负数: 我们可以将其看作 false,代表不符合要求,交换

如果返回值 =0: 交换函数失效,不动。

3.应用

所以这样的话当我们遇到了 [3, 1, 2, 4] 这样一个数组。
比如我们想要升序排列,从小到大排列,后面的大于前面的。
我们可以在比较函数中这样写

var arr = [3, 1, 2, 4];

arr.sort((a, b) => {
	// 这里再次强调一下,a 代表的是后面一个元素,b 才是前面的元素
    // 如果后面的元素大于前面的元素,我们就返回正数1,代表已经符合要求啦,不需要交换。否则返回-1,交换
    if(a > b) return 1
    else return -1
})

console.log(arr);
// output
[ 1, 2, 3, 4 ]

我们可以看到这样我们的目的就已经达到了,但是这样显然不够优雅。尤其是对于数字来说,我们可以直接通过加减来得到正负数。

var arr = [3, 1, 2, 4];

arr.sort((a, b) => a - b)

console.log(arr);

// output
[ 1, 2, 3, 4 ]

事实上,比较函数对于返回正负数所表现的包容性就是为了我们可以更加便捷的使用排序。

PS:当我们遇到没有数字的排序时,我们就可以用第一种方法来根据情况返回1或者-1进行排序。

3.总结

  1. a代表相邻两元素中后面一个,b代表前面一个!!!(第三次强调,)
  2. 返回正数代表符合要求不用动,负数代表不符合要求要交换,0代表失效不进行任何操作。
  3. 数字排序常见返回 a-b。后面一个减去前面一个,是正数才符合要求,最终排出来都是后面的大,代表升序。
  4. 返回 b-a,是前面减去后面,是正数就符合要求不动,最终排出来什么样子大家思考一下。
  5. 遇到更加个性化的排序,返回±1来决定是否进行转换操作。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值