function sortByKey(key,desc) { return function(a,b){ return desc ? ~~(a[key] < b[key]) : ~~(a[key] > b[key]); } }
请大手帮我解释下核心代码是什么意思?~~(a[key] < b[key])这句的波浪线是什么意思?
~~(a[key] < b[key])
拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...
a[key] < b[key] 和 a[key] > b[key] 返回的是布尔型值,true 或 false,把它们强制转换为整数,得到的是 1 或者 0。
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) 必须总是对相同的输入返回相同的比较结果,否则排序的结果将是不确定的。
如果 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 "效率较高可读性较低。其实习惯就好。如:
~~
Math.floor
var i = 1.6; alert(~~i);//输出1 alert(Math.floor(i));//输出1
具体这个方法是否能够满足其他调用需求,这个就不是很清楚了,不过方法中的desc具体表示什么意思,确实可以讨论一下:
desc
假如要排序的内容如下:
var arr=[12,23,5];
用冒泡排序把上面的数组从小到大排序。比较大小有几种情况:大于,小于,等于,如果我问你12>23吗?你告诉我不大于,那么我就可以知道12可能等于23或者是12小于23,由于我们是按从小到大的顺序排序的,所以我就不需要进行任何操作。
12>23
12
23
同理,我问你23>5吗?你告诉我大于,那么
23>5
var arr=[12,5,23];
现在最高位已经是23,已经是最大的值了。采纳的答案回答得很好,不过说这个是不能排序的恐怕是有欠妥当的。
强制转化为整数
a[key] < b[key]
和a[key] > b[key]
返回的是布尔型值,true
或false
,把它们强制转换为整数,得到的是1
或者0
。但是 sort 函数需要返回值是大于、等于或者小于 0 的整数用来排序。比如
a[key] > b[key]
,返回正整数,a[key] < b[key]
返回负整数。所以,这个排序函数并不会真正的排序。按你的意思,真正需要的是
中间那部分还可以简化一下(代码简化了,但不是那么好理解)
关于排序,可以参考Array.prototype.sort() 的 compareFunction 部分,注意对 compareFunction 返回结果的说明
双波浪线"
~~
"等价于Math.floor
取整,"~~
"的效率较高可读性较差,"Math.floor
"效率较高可读性较低。其实习惯就好。如:
具体这个方法是否能够满足其他调用需求,这个就不是很清楚了,不过方法中的
desc
具体表示什么意思,确实可以讨论一下:假如要排序的内容如下:
用冒泡排序把上面的数组从小到大排序。
比较大小有几种情况:大于,小于,等于,如果我问你
12>23
吗?你告诉我不大于,那么我就可以知道12
可能等于23
或者是12
小于23
,由于我们是按从小到大的顺序排序的,所以我就不需要进行任何操作。同理,我问你
23>5
吗?你告诉我大于,那么现在最高位已经是23,已经是最大的值了。
采纳的答案回答得很好,不过说这个是不能排序的恐怕是有欠妥当的。
强制转化为整数