search

Home  >  Q&A  >  body text

javascript - js 数组排序方法

function sortByKey(key,desc) {
    return function(a,b){
        return desc ? ~~(a[key] < b[key]) : ~~(a[key] > b[key]);
    }
}

请大手帮我解释下核心代码是什么意思?
~~(a[key] < b[key])这句的波浪线是什么意思?

高洛峰高洛峰2776 days ago611

reply all(3)I'll reply

  • 大家讲道理

    大家讲道理2017-04-11 09:04:23

    a[key] < b[key]a[key] > b[key] 返回的是布尔型值,truefalse,把它们强制转换为整数,得到的是 1 或者 0

    但是 sort 函数需要返回值是大于、等于或者小于 0 的整数用来排序。比如 a[key] > b[key],返回正整数,a[key] < b[key] 返回负整数。所以,这个排序函数并不会真正的排序。

    按你的意思,真正需要的是

    function sortByKey(key,desc) {
        return function(a,b){
            var r = a[key] < b[key] ? -1 : (a[key] > b[key] ? 1 : 0);
            return desc ? -r : r;
        }
    }

    中间那部分还可以简化一下(代码简化了,但不是那么好理解)

        return desc
            ? ~~(a[key] < b[key]) - ~~(a[key] > b[key])
            : ~~(a[key] > b[key]) - ~~(a[key] < b[key]);

    关于排序,可以参考Array.prototype.sort() 的 compareFunction 部分,注意对 compareFunction 返回结果的说明

    如果 compareFunction(a, b) 小于 0 ,那么 a 会被排列到 b 之前;

    如果 compareFunction(a, b) 等于 0 , a 和 b 的相对位置不变。备注: ECMAScript 标准并不保证这一行为,而且也不是所有浏览器都会遵守(例如 Mozilla 在 2003 年之前的版本);

    如果 compareFunction(a, b) 大于 0 , b 会被排列到 a 之前。

    compareFunction(a, b) 必须总是对相同的输入返回相同的比较结果,否则排序的结果将是不确定的。

    reply
    0
  • 怪我咯

    怪我咯2017-04-11 09:04:23

    双波浪线" ~~ "等价于 Math.floor 取整," ~~ "的效率较高可读性较差," Math.floor "效率较高可读性较低。其实习惯就好。
    如:

    var i = 1.6;
    alert(~~i);//输出1
    alert(Math.floor(i));//输出1

    具体这个方法是否能够满足其他调用需求,这个就不是很清楚了,不过方法中的desc具体表示什么意思,确实可以讨论一下:

    function sortByKey(key,desc) {
        return function(a,b){
            return desc ? ~~(a[key] < b[key]) : ~~(a[key] > b[key]);
        }
    }

    假如要排序的内容如下:

    var arr=[12,23,5];

    用冒泡排序把上面的数组从小到大排序。
    比较大小有几种情况:大于,小于,等于,如果我问你12>23吗?你告诉我不大于,那么我就可以知道12可能等于23或者是12小于23,由于我们是按从小到大的顺序排序的,所以我就不需要进行任何操作。

    var arr=[12,23,5];

    同理,我问你23>5吗?你告诉我大于,那么

    var arr=[12,5,23];

    现在最高位已经是23,已经是最大的值了。
    采纳的答案回答得很好,不过说这个是不能排序的恐怕是有欠妥当的。

    reply
    0
  • 巴扎黑

    巴扎黑2017-04-11 09:04:23

    强制转化为整数

    reply
    0
  • Cancelreply