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

如何为对象添加键值对?日期数组转月-日期对象问题排查

问题排查与修复方案

你的代码输出空对象主要有几个关键问题,我来一步步拆解并修复:

核心问题分析

  1. monthNames未定义:代码里直接用了monthNames[d.getMonth()]但没有声明这个月份名称数组,这会导致运行时错误,后续逻辑根本走不下去。
  2. 无效的for...in循环:初始时dateObject是空对象,这个循环从一开始就不会执行,自然无法往对象里添加任何内容。
  3. 错误的赋值逻辑:就算循环执行了,你的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:20:54