You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:52:16