如何使用Moment JS填充日期边界间数组缺失的日期并补全y值为0
用Moment.js补全日期范围缺失数据的解决方案
没问题!用Moment.js完全可以轻松实现这个需求,我给你梳理下具体的实现思路和代码示例:
核心思路
- 先生成
startBound到endBound之间的完整日期序列,确保每个日期都覆盖到 - 将原始数据转换成以日期为键的对象,方便快速查找已有数据的
y值 - 遍历完整日期序列,匹配已有数据的
y值,缺失的日期直接设y: 0,最后重新组装成目标数组
完整代码实现
// 原始数据 var data = [{ "x": "2018-05-02", "y": 8 }, { "x": "2018-05-06", "y": 4 }]; var startBound = '2018-05-01'; // 起始边界 var endBound = '2018-05-07'; // 结束边界 // 1. 将原始数据转为对象,方便快速查找 const dataMap = data.reduce((map, item) => { map[item.x] = item.y; return map; }, {}); // 2. 生成完整的日期序列 const fullDates = []; let currentDate = moment(startBound); const endDate = moment(endBound); while (currentDate.isSameOrBefore(endDate)) { const dateStr = currentDate.format('YYYY-MM-DD'); fullDates.push(dateStr); currentDate.add(1, 'day'); } // 3. 组装补全后的数据 const completedData = fullDates.map(date => ({ x: date, y: dataMap[date] || 0 })); console.log(completedData);
输出结果
运行后你会得到补全后的数组:
[ {"x": "2018-05-01", "y": 0}, {"x": "2018-05-02", "y": 8}, {"x": "2018-05-03", "y": 0}, {"x": "2018-05-04", "y": 0}, {"x": "2018-05-05", "y": 0}, {"x": "2018-05-06", "y": 4}, {"x": "2018-05-07", "y": 0} ]
这个方法逻辑清晰,效率也不错——用对象映射查找的时间复杂度是O(1),整体处理的时间复杂度是O(n)(n为日期范围的天数),非常适合这类补全场景。
内容的提问来源于stack exchange,提问作者scopeak
相关产品推荐
相关产品推荐

