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

