使用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
相关产品推荐
相关产品推荐

