JavaScript温故知新----Array.sort()

默认情况下,sort()方法会从小到大的排列数组中的每一项,为了实现排序, sort()方法会调用每个数组项的 toString()转型方法,然后比较得到的字符串,以确定如何排序。

但是sort排序时,会调用数组每一项的toString()转型方法,然后比较所得的字符串,已确定如何排序。即使数组中每一项都是数组,sort()方法比较的也是字符串。

var values = [0, 1, 5, 10, 15];
values.sort();
console.log(values)  // [0, 1, 10, 15, 5]

这里虽然10比5大,但是字符串比较时,10比5小,所以会出现10在5的前面。

"1">"5"
false

"6">"5"
true

"1">"0.5"
true

"abc">"aabdfg"
true

既然碰到了,就补充一下这方面的知识:
为什么会是这样呢?

字符是ASCII值确定,比较规则是,从第一个字符开始,顺次向后直到出现不同的字符为止,然后以第一个不同的字符的ASCII值确定,例如上面的”abc”和”aabdfg”,由于第一个字符相同,都是’a’所以看下一个字符,第二个字符,一个是’b’,一个是‘a’,由于b的ASCII值比a的ASCII值大,所以,这二个字符串的比较结果是”abc”>”aabdfg”。


然后我们回到正题:
因为sort()方法默认使用的是字符串比较方法,这个不靠谱,所以为了让它靠谱,它可以接收一个比较函数作为参数,以便我们指定哪个值位于哪个值的前面。

比较函数的原理:

比较函数接收两个参数 a、b,
如果a < b,则返回一个负数,表示第一个参数应该位于第二个之前;
如果a = b,则返回 0,表示这两个参数的位置不变;
如果a > b,则返回一个正数,表示第一个参数应该位于第二个之后。

比较函数:

function compare(value1, value2) {
    if (value1 < value2) {
        return 1;
    } else if (value1 > value2) {
        return -1;
    } else {
        return 0;
    }
}

简写:

function compare(value1, value2) {
    return value1 - value2;
}

举个栗子:


function compare(value1, value2) {
    return value1 - value2;
}
var values = [0, 1, 5, 10, 15];
values.sort(compare);
console.log(values);
//[0, 1, 5, 10, 15]

如果需要逆序排列,就把返回的正负值颠倒过来。

function compare(value1, value2) {
    if (value1 < value2) {
        return - 1;
    } else if (value1 > value2) {
        return 1;
    } else {
        return 0;
    }
}

当然也可以简写:

function compare(value1, value2) {
    return value2 - value1;
}

举个栗子:

function compare(value1, value2) {
    return value2 - value1;
}
var values = [0, 1, 5, 10, 15];
values.sort(compare);
console.log(values)
//[15, 10, 5, 1, 0]

如何判断逆序或者顺序?

对于简化版函数来说,

拿前者减后者,就是顺序排列,
拿后者减前者,就是逆序排列。

今天sort方法,不再是问题,开心。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值