如何为对象添加键值对?日期数组转月-日期对象问题排查
问题排查与修复方案
你的代码输出空对象主要有几个关键问题,我来一步步拆解并修复:
核心问题分析
monthNames未定义:代码里直接用了monthNames[d.getMonth()]但没有声明这个月份名称数组,这会导致运行时错误,后续逻辑根本走不下去。- 无效的
for...in循环:初始时dateObject是空对象,这个循环从一开始就不会执行,自然无法往对象里添加任何内容。 - 错误的赋值逻辑:就算循环执行了,你的
Object.assign写法也完全不符合需求——它会覆盖已有键,而且没有处理数组收集日期的逻辑。
修复后的代码
// 先定义月份名称数组,注意索引对应Date.getMonth()的返回值(0=1月,4=5月) const monthNames = ["january", "february", "march", "april", "may", "june", "july", "august", "september", "october", "november", "december"]; const arr = ["2018/05/24","2018/05/30"]; function buildObject(obj: string[]) { let dateObject: {[key: string]: string[]} = {}; obj.forEach((element) => { const d = new Date(element); // 确保日期解析正常(避免无效日期导致的NaN) if (isNaN(d.getTime())) return; const monthName = monthNames[d.getMonth()]; // 核心逻辑:判断当前月份键是否存在,存在则push日期,不存在则初始化数组 if (dateObject[monthName]) { dateObject[monthName].push(element); } else { dateObject[monthName] = [element]; } }); console.log("____DATES", dateObject); return dateObject; } console.log(buildObject(arr));
关键改进点
- 新增了完整的
monthNames数组,匹配Date.getMonth()的0-11索引值。 - 去掉了无效的
for...in循环,改用直接判断月份键是否存在的逻辑,实现日期数组的收集。 - 增加了日期有效性校验(
isNaN(d.getTime())),避免无效日期字符串导致的错误。 - 给TypeScript变量添加了明确的类型注解,让代码更严谨。
运行这段代码后,就能得到你期望的输出:{ 'may': ['2018/05/24', '2018/05/30'] }
内容的提问来源于stack exchange,提问作者hussain
相关产品推荐
相关产品推荐

