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

使用_.groupBy与momentjs format分组时返回undefined键的问题

解决lodash _.groupBy分组键为undefined的问题

我之前也踩过这个坑!明明觉得日期格式化逻辑没问题,但分组结果里就是出现了undefined的键,大概率是你的日期处理函数在部分数据上返回了undefined,导致_.groupBy把这些数据归到了undefined键下。下面给你拆解几个常见原因和解决办法:

1. 先检查原始数据的日期字段是否有效

很多时候问题出在数据源上:

  • 有些记录的日期字段是null、空字符串,或者格式完全不符合预期(比如是2018-02-28而非/分隔,甚至是2018/02/30这种无效日期)
  • 如果你直接用new Date()处理这些无效值,会得到Invalid Date,后续调用getFullYear()等方法会返回NaN,拼接出来的字符串要么是NaN/NaN/NaN,如果你的函数里有判断逻辑,可能直接返回了undefined

举个反例(会导致undefined键的写法):

// 错误示例:没有处理无效日期
const grouped = _.groupBy(records, item => {
  const date = new Date(item.date);
  // 如果item.date无效,这里会返回异常格式字符串,或直接return undefined
  return `${date.getFullYear()}/${String(date.getMonth()+1).padStart(2, '0')}/${String(date.getDate()).padStart(2, '0')}`;
});

2. 给日期格式化函数加容错处理

给你的日期转换逻辑加一层有效性校验,确保无论输入什么,都能返回一个明确的键(哪怕是“无效日期”这种标记),避免返回undefined:

// 带容错的日期格式化函数
const formatToYYYYMMDD = (dateStr) => {
  const date = new Date(dateStr);
  // 检查日期是否有效:getTime()返回NaN则表示无效
  if (isNaN(date.getTime())) {
    return '无效日期';
  }
  const year = date.getFullYear();
  // 月份从0开始,要+1,并且补0到两位
  const month = String(date.getMonth() + 1).padStart(2, '0');
  const day = String(date.getDate()).padStart(2, '0');
  return `${year}/${month}/${day}`;
};

// 正确分组写法
const groupedData = _.groupBy(records, item => formatToYYYYMMDD(item.date));

3. 检查字段名是否写错

别笑,这真的是高频错误!比如你的原始数据里日期字段叫createAt,但你在分组时写成了item.date,这时候item.date就是undefined,格式化函数自然返回undefined,直接导致分组键异常。

完整示例

假设你的原始数据是:

const records = [
  { id: 1, date: '2018-02-28' },
  { id: 2, date: '2018/02/28' },
  { id: 3, date: 'invalid-date' },
  { id: 4, date: '2018-02-28T14:30:00Z' }
];

用上面的代码分组后,结果会是:

{
  "2018/02/28": [
    { id: 1, date: '2018-02-28' },
    { id: 2, date: '2018/02/28' },
    { id: 4, date: '2018-02-28T14:30:00Z' }
  ],
  "无效日期": [
    { id: 3, date: 'invalid-date' }
  ]
}

这样就彻底避免了undefined分组键的问题,还能把异常数据单独归类,方便后续排查~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:36:55