javascript - js 数组排序方法
高洛峰
高洛峰 2017-04-11 09:02:23
0
3
610
function sortByKey(key,desc) {
    return function(a,b){
        return desc ? ~~(a[key] < b[key]) : ~~(a[key] > b[key]);
    }
}

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

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

répondre à tous(3)
大家讲道理

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) 必须总是对相同的输入返回相同的比较结果,否则排序的结果将是不确定的。

刘奇

双波浪线" ~~ "等价于 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,已经是最大的值了。
采纳的答案回答得很好,不过说这个是不能排序的恐怕是有欠妥当的。

巴扎黑

强制转化为整数

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal