84669 person learning
152542 person learning
20005 person learning
5487 person learning
7821 person learning
359900 person learning
3350 person learning
180660 person learning
48569 person learning
18603 person learning
40936 person learning
1549 person learning
1183 person learning
32909 person learning
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,已经是最大的值了。
采纳的答案回答得很好,不过说这个是不能排序的恐怕是有欠妥当的。
强制转化为整数