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