JavaScript数组多条件排序结果不符合预期 问题排查
代码排序失效的核心问题
你的代码一共存在3个会导致结果不符合预期的错误:
- 自动分号插入(ASI)导致所有比较逻辑不执行
比较函数中return关键字后直接换行,JS引擎会自动在return末尾补充分号,相当于函数直接返回undefined,后面写的所有排序规则完全没有被执行,排序结果不可控。 - 括号嵌套错误,第三层日期排序规则永久失效
第二层completed字段比较的括号位置写错,原错误片段如下:
这里a.completed.toString().localeCompare(b.completed.toString() || b.lastUpdate.toString().localeCompare(a.lastUpdate.toString()))||逻辑被包裹在localeCompare的参数内部,逻辑变成「如果b.completed.toString()为假值,才执行日期比较」。但布尔值转字符串后得到的"false"/"true"都是非空真值,因此第三层按日期排序的逻辑永远不会触发。 - 冗余的toString()调用无意义,布尔值比较用数值运算更可靠
side本身就是字符串类型,不需要额外调用toString();布尔值转字符串比较虽然刚好符合false在前true在后的升序要求,但直接做数值减法更稳妥,不会出现字符串比较的意外问题。
修复后可直接运行的代码
let arr = [ { side: "SELL", completed: true, lastUpdate: "2021-06-21 21:47:09" }, { side: "BUY", completed: true, lastUpdate: "2022-06-21 21:47:09" }, { side: "BUY", completed: false, lastUpdate: "2020-06-21 21:47:09" }, { side: "SELL", completed: true, lastUpdate: "2023-06-21 21:47:09" }, { side: "BUY", completed: true, lastUpdate: "2019-06-21 21:47:09" } ]; arr.sort(function (a, b) { return a.side.localeCompare(b.side) || (a.completed - b.completed) || b.lastUpdate.localeCompare(a.lastUpdate); }); console.log(arr)
修复说明
- 调整
return语句格式,避免自动分号插入问题,确保比较逻辑正常执行 - 修正括号位置,三层排序规则通过
||正确串联:前一个字段比较结果相等(返回0)时,才会执行下一个字段的比较 - 布尔字段用
a.completed - b.completed比较:false对应数值0、true对应数值1,升序时0在前1在后,完全符合false在前true在后的要求 - 日期字段为严格的
YYYY-MM-DD HH:mm:ss格式,字符串字典序和时间先后顺序完全一致,倒序时用b.lastUpdate.localeCompare(a.lastUpdate)即可实现最新日期排在前面的效果
内容的提问来源于stack exchange,提问作者markzzz
相关产品推荐
相关产品推荐

