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

使用Moment.js排序含MMM-YY格式键的JavaScript对象无效问题排查

解决按MMM-YY格式键排序JavaScript对象的问题

你遇到的问题主要出在排序逻辑的几个细节上,我来帮你拆解并修正:

1. 错误的排序比较目标

Object.entries(obj)返回的是[键名, 对应值]格式的数组,你在sort回调里直接用a和b,相当于把整个[键, 值]数组传给了moment解析,这显然不是你要的日期键,自然无法正确排序。

2. 冗余且错误的日期解析逻辑

你同时嵌套了moment()和Date.parse(),而且写法完全错误:moment(key, "MMM-YY")本身就能生成有效的日期对象,直接调用.valueOf()就能拿到时间戳,不需要再套Date.parse;更不用把两个时间戳的差值传给Date.parse——这会生成无效的日期值,直接导致排序逻辑彻底失效。

修正后的代码

const object = { "Apr-18" : { "a":"b" }, "Jan-18" : { "c":"d" }, "Feb-18" : { "e":"f" } }

const sortObjectMonths = (obj) => {
  return Object.fromEntries(
    Object.entries(obj).sort(([keyA], [keyB]) => {
      // 提取日期键,解析为时间戳后比较
      const timestampA = moment(keyA, "MMM-YY").valueOf();
      const timestampB = moment(keyB, "MMM-YY").valueOf();
      return timestampA - timestampB;
    })
  );
};

let sorted = sortObjectMonths(object);
console.log(sorted);

额外说明

  • ES6+标准中,JavaScript对象会保留键的插入顺序,所以Object.fromEntries会按照排序后的数组顺序生成新对象,你就能看到按月份排序的结果了。
  • 如果不习惯解构语法,也可以用数组下标取键名,效果完全一致:
    Object.entries(obj).sort((a, b) => {
      const timestampA = moment(a[0], "MMM-YY").valueOf();
      const timestampB = moment(b[0], "MMM-YY").valueOf();
      return timestampA - timestampB;
    })
    

内容的提问来源于stack exchange,提问作者mcgovec9

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 06:27:31