按值属性排序Map:能否简化排序函数中的判断逻辑?
简化方案
当然可以简化,核心是把「分组判断」和「同组排序」拆成两步,用更简洁的表达式替代复杂的多条件组合:
简化版代码
iters = 0; sorted = new Map([...m].sort((a, b) => { iters += 1; // 先判断分组:refCount为0的排在前面 const groupDiff = (a[1].refCount === 0 ? 0 : 1) - (b[1].refCount === 0 ? 0 : 1); if (groupDiff !== 0) { return groupDiff; } // 同组内按loadstamp升序排列 return a[1].loadstamp - b[1].loadstamp; })); console.log(`total iters: ${iters}`); sorted.forEach( (v,k) => console.log(`key: ${k}; refCount: ${v.refCount}; loadStamp: ${v.loadstamp}`) );
逻辑说明
分组判断简化:
用(a[1].refCount === 0 ? 0 : 1) - (b[1].refCount === 0 ? 0 : 1)一行代码完成分组判断:- 如果
a是refCount=0、b非0,结果为0-1=-1,sort函数返回负数,a排在b前面(符合规则); - 如果
a非0、b是refCount=0,结果为1-0=1,sort函数返回正数,b排在a前面(符合规则); - 如果两者同组(都为0或都非0),结果为
0,进入同组排序逻辑。
- 如果
更简洁的分组写法:
还可以利用布尔值转数字的特性进一步简化分组判断(效果完全一致):const groupDiff = Number(a[1].refCount > 0) - Number(b[1].refCount > 0);这里
refCount>0为true时转数字是1,为false时是0,逻辑和上面的三元表达式完全等价。
验证结果
运行简化后的代码,输出和原代码完全一致,迭代次数同样是35次,说明逻辑完全符合要求。
内容的提问来源于stack exchange,提问作者Gary
相关产品推荐
相关产品推荐

