Maison > Questions et réponses > le corps du texte
function sortByKey(key,desc) {
return function(a,b){
return desc ? ~~(a[key] < b[key]) : ~~(a[key] > b[key]);
}
}
请大手帮我解释下核心代码是什么意思?~~(a[key] < b[key])
这句的波浪线是什么意思?
大家讲道理2017-04-11 09:04:23
a[key] < b[key]
和 a[key] > b[key]
返回的是布尔型值,true
或 false
,把它们强制转换为整数,得到的是 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) 必须总是对相同的输入返回相同的比较结果,否则排序的结果将是不确定的。
怪我咯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,已经是最大的值了。
采纳的答案回答得很好,不过说这个是不能排序的恐怕是有欠妥当的。