JSON.parse处理日期可用性查询数据时monthlyresults丢失如何修复
日期可用性校验返回数据异常修复方案
根因定位
- 并非
JSON.parse导致数据丢失:srStr是值类型字符串,打印时输出的是执行时刻的快照;而浏览器控制台打印对象时保存的是引用,你看到的sr的monthlyresults为空,是后续filter操作修改了该字段后,控制台展开对象时读取了修改后的值,并非解析阶段丢失。 filter返回空数组的核心原因:- 仅校验了月份匹配,未校验年份:
getMonth()返回0-11的月份序号,不同年份的相同月份会被误过滤 moment解析result.date格式不匹配,导致日期解析结果错误,月份判断不成立
- 仅校验了月份匹配,未校验年份:
修复代码
searchFakeMonthlyAvailability(query: FormData): Promise<Results> { return new Promise<Results>((resolve, reject) => { setTimeout(() => { let srStr: string = JSON.stringify(searchMonthlyResults); let sr: Results = JSON.parse(srStr); console.log('srStr: ', srStr); // 打印解析后真实值,避免控制台引用干扰 console.log('parse后sr快照:', JSON.stringify(sr)); // 提前计算目标年月,避免重复执行逻辑 const targetDate = moment(query.startDate).toDate(); const targetMonth = targetDate.getMonth(); const targetYear = targetDate.getFullYear(); // 修正过滤逻辑:同时匹配年份+月份,若日期格式特殊可给moment传第二参数指定格式,如moment(result.date, 'YYYY/MM/DD') sr.monthlyresults = sr.monthlyresults.filter(result => { const resDate = moment(result.date).toDate(); return resDate.getMonth() === targetMonth && resDate.getFullYear() === targetYear; }); resolve(sr); }, 1500); }); }
额外排查建议
- 若调整后仍返回空数组,可在filter逻辑中打印每个
result.date的解析结果,确认是否存在日期格式解析异常 - 后续打印对象时可统一用
JSON.stringify转成字符串输出,拿到执行时刻的真实快照,避免控制台引用机制导致的判断偏差
内容的提问来源于stack exchange,提问作者Nhan Nguyen
相关产品推荐
相关产品推荐

