JavaScript中布尔值排序:该比较器写法是否正确?
布尔值排序代码的正确性验证
我找到如下布尔值排序代码:
const sorted = things.sort((left, right) => { return Number(!!left.current) - Number(!!right.current); });请问这种排序布尔值的方式是否正确?
这种排序方式完全正确,而且是一种很稳妥的处理方式,我来拆解下它的工作逻辑:
第一步:
!!left.current和!!right.current
这一步是把current属性的任意值强制转换为布尔类型。不管current是undefined、null、0、空字符串这类假值,还是对象、非空字符串、正数这类真值,!!都会统一把它们转成true或false,避免了不同类型值直接比较可能出现的潜在问题。第二步:
Number(...)
JavaScript里Number(true)会返回1,Number(false)返回0。把布尔值转成数字后,就能通过减法得到排序所需的差值:- 如果
left.current是假值、right.current是真值:0 - 1 = -1,此时left会被排在right前面 - 如果两者都是假值或都是真值:
0-0=0或1-1=0,元素相对位置保持不变(注:Array.sort是不稳定排序,但同值元素的顺序不影响布尔值排序的最终结果) - 如果
left.current是真值、right.current是假值:1 - 0 = 1,此时right会被排在left前面
- 如果
最终效果是:所有current为假值的元素会排在数组前面,真值的元素排在后面。如果想反过来让真值在前,只需要调换减法的顺序即可:
const sorted = things.sort((left, right) => { return Number(!!right.current) - Number(!!left.current); });
举个实际例子,假设things是:
const things = [ { current: 'active' }, { current: null }, { current: false }, { current: 123 } ];
用你的代码排序后会得到:
[ { current: null }, { current: false }, { current: 'active' }, { current: 123 } ]
完全符合预期。
内容的提问来源于stack exchange,提问作者dagda1
相关产品推荐
相关产品推荐

