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

基于已有数组生成12个月份的对象数组,缺失月份值设为0

生成包含全年12个月的数组,匹配已有数据并补全默认项

需求说明

创建一个包含12个对象的数组,每个对象对应YYYY-XX格式的月份:

  • 若月份存在于给定数组arr1中,直接加入该数组的对应对象
  • 若月份不存在,添加默认对象(格式:{date: "YYYY-XX", value: 0})

示例数据

待匹配数组:

const arr1 = [
  {
    date: "2024-02",
    value: "100" 
  },
  {
    date: "2024-08",
    person: "200" 
  },
];

当前代码问题

原实现存在多处逻辑错误:

  • 循环嵌套map会重复遍历数组,效率低下且逻辑混乱
  • 错误访问arr1.date,应使用遍历项item.date
  • slice(0,5)截取的是2024-,与数字i永远无法匹配,正确操作应为截取月份部分(如slice(-2))并转为数字
  • 未处理月份不存在的场景,没有添加默认对象

正确实现代码

const getMonthlyAmount = (arr1) => {
  // 将arr1转为以日期为键的映射表,提升查找效率
  const dateMap = arr1.reduce((map, item) => {
    map[item.date] = item;
    return map;
  }, {});

  const result = [];
  const year = "2024"; // 可根据需求改为动态年份

  for (let i = 1; i <= 12; i++) {
    // 将月份转为两位格式(如1→"01")
    const month = i.toString().padStart(2, "0");
    const currentDate = `${year}-${month}`;
    
    // 匹配已有数据或生成默认对象
    const matchedItem = dateMap[currentDate] || { date: currentDate, value: 0 };
    result.push(matchedItem);
  }

  return result;
};

// 调用示例
const arr = getMonthlyAmount(arr1);
console.log(arr);

代码说明

  1. 构建日期映射表:通过reduce把arr1转为{ "YYYY-XX": 对应对象 }的结构,实现O(1)时间复杂度的查找,避免重复遍历数组
  2. 统一月份格式:用padStart(2, "0")将1-9月转为两位数字,保证日期格式与arr1一致
  3. 匹配与补全:对每个月份先查找映射表,存在则复用原对象,不存在则创建默认的value:0对象,确保结果数组恰好包含12个月份项

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 06:21:02