You need to enable JavaScript to run this app. JavaScript数据清洗:计算累计值并补全数组中缺失的连续日期
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript数据清洗:计算累计值并补全数组中缺失的连续日期

可直接落地的实现方案

你最初想用map遍历原数组的思路存在局限:map会严格按照原数组的长度遍历,没法插入中间缺失的日期节点,因此需要先搭好完整的连续日期轴,再逐天填充数值、计算累计值,整体实现不依赖第三方库:

核心实现逻辑

  • 修正原数据的格式问题:原示例中date字段的日期字符串缺引号,直接写2020-01-01会被JS解析为减法运算,实际使用时需要加引号转为字符串格式
  • 生成原数据的日期-值映射表,支持O(1)时间查找某个日期对应的原始value
  • 提取原数据的最早日期、最晚日期作为整个时间区间的起止点
  • 从起始日期开始逐天遍历到结束日期,逐个填充当日value、累加计算累计值:没有对应原始数据的日期,value自动设为0,因为0参与累加时不改变总数,因此累计值会自然和前一天保持一致,不需要额外做特殊判断

完整可运行代码

// 本地日期格式化,避免toISOString带来的时区偏移问题
function formatLocalDate(date) {
  const year = date.getFullYear()
  const month = String(date.getMonth() + 1).padStart(2, '0')
  const day = String(date.getDate()).padStart(2, '0')
  return `${year}-${month}-${day}`
}

// 修正后的原始数据
const data = [
  {date: '2020-01-01', value: 1},
  {date: '2020-01-03', value: 2},
  {date: '2020-01-04', value: 2},
  {date: '2020-01-07', value: 8}
]

// 生成日期-值映射
const dateValueMap = new Map(data.map(item => [item.date, item.value]))

// 确定时间区间的起止日期
const startDate = new Date(data[0].date)
const endDate = new Date(data[data.length - 1].date)

const result = []
let cumulativeValue = 0
let currentTraverseDate = new Date(startDate)

// 逐天遍历直到结束日期
while (currentTraverseDate <= endDate) {
  // 转换为和原数据一致的YYYY-MM-DD格式字符串
  const dateStr = formatLocalDate(currentTraverseDate)
  // 取当日原始value,无数据则默认0
  const currentValue = dateValueMap.get(dateStr) ?? 0
  
  cumulativeValue += currentValue
  result.push({
    date: dateStr,
    value: currentValue,
    cumulativeValue
  })

  // 日期向后推1天
  currentTraverseDate.setDate(currentTraverseDate.getDate() + 1)
}

实现效果校验

最终生成的result数组和预期输出完全匹配:

  • 缺失的2020-01-02、2020-01-05、2020-01-06都会自动补入,对应value为0
  • 累计值逐天累加,缺失日期的累计值和前一有效日期完全一致
  • 整体遍历没有嵌套循环,时间复杂度为O(n)(n为日期区间总天数),可直接处理常规量级的时间序列数据

内容的提问来源于stack exchange,提问作者console.log

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.04 03:06:09