momentjs对象数组排序结果不准确问题求助
Moment.js日期数组排序结果不准确?你踩了sort回调的返回值坑!
哦,这个问题我之前也碰到过!你写的排序逻辑之所以出错,核心原因是误解了JavaScript Array.sort()方法对回调函数返回值的要求。
你当前的代码:
const sortedArray = [...merged].sort((a, b) => (a.txDate.isAfter(b.txDate)));
这里a.txDate.isAfter(b.txDate)会返回一个布尔值(true或false),但sort()要求回调必须返回数字值:
- 返回正数:表示
a应该排在b的后面 - 返回负数:表示
a应该排在b的前面 - 返回0:表示两者顺序不变
当你传入布尔值时,JavaScript会自动把true转成1,false转成0,这就完全打乱了排序逻辑,导致你看到的混乱结果。
正确的两种写法
方法1:用Moment.js的diff方法(最简洁)
diff方法会直接返回两个日期之间的毫秒差,完美符合sort()的要求:
// 升序排序(旧日期在前,新日期在后) const sortedArray = [...merged].sort((a, b) => a.txDate.diff(b.txDate)); // 降序排序(新日期在前,旧日期在后) const sortedArray = [...merged].sort((a, b) => b.txDate.diff(a.txDate));
方法2:基于isAfter/isBefore手动返回数字
如果你更习惯用isAfter这类语义化方法,可以手动把布尔判断转换成对应数字:
// 升序排序 const sortedArray = [...merged].sort((a, b) => { if (a.txDate.isAfter(b.txDate)) { return 1; // a比b晚,排后面 } else if (a.txDate.isBefore(b.txDate)) { return -1; // a比b早,排前面 } return 0; // 日期相同,顺序不变 });
验证你的示例数组
用正确代码排序后,你给出的示例数组会变成符合预期的顺序:
[ { txDate: moment("2017-12-31T00:00:00.000"), id: 0 }, { txDate: moment("2018-01-02T00:00:00.000"), id: 2 }, { txDate: moment("2018-02-14T00:00:00.000"), id: 45 }, { txDate: moment("2018-02-15T00:00:00.000"), id: 46 }, // ...其他后续元素 ]
内容的提问来源于stack exchange,提问作者DrLove
相关产品推荐
相关产品推荐

