JavaScript自定义compare函数在Chrome与Firefox中排序结果不一致
问题原因
- 返回值逻辑倒置
Array.sort的比较函数规则为:返回负数则a排在b前,返回正数则b排在a前,返回0则二者相对顺序不变。你当前的else分支中return a.active ? 1 : -1的逻辑完全倒置:当a是active状态、b为非active状态时,返回1会把a排到b后面,和你要求的「active元素排在前面」的需求完全相反。Chrome中表现符合预期属于底层排序算法实现的巧合,逻辑本身就存在错误,Firefox的严格排序逻辑直接暴露了这个问题。 - 未覆盖双非active的排序场景
你只处理了两个元素都为active的情况,当两个元素active都为false时,没有编写按name排序的逻辑,会导致非active分组内的排序不符合预期。
修复后的代码
let compare = (a, b) => { // 第一层优先比较active状态 if (a.active !== b.active) { return a.active ? -1 : 1; } // 第二层active状态相同则按name升序排序 const Aname = a.name.toUpperCase(); const Bname = b.name.toUpperCase(); return Aname > Bname ? 1 : Aname < Bname ? -1 : 0; };
验证说明
修复后的代码在所有符合ES规范的浏览器中都能实现预期效果:
- 所有active为true的元素排在列表前半部分,按name升序排列
- 所有active为false的元素排在列表后半部分,按name升序排列
内容的提问来源于stack exchange,提问作者Kat
相关产品推荐
相关产品推荐

