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

如何基于给定列表在JavaScript中生成指定格式的新数组

问题描述

现有以下JavaScript数组与对象:

// 注:原代码中headr元素应为字符串(否则会因未定义变量报错),此处修正
const headr = ['H1', 'H2', 'H3', 'H4'];
const Year = ['1Y', '2Y', '3Y', '4Y'];
// 修正原arr_的语法错误,调整为合法JS对象格式
let arr_ = {
    H1: [
        {Year: '1Y', Type: 'TypeA', Value: -41445643364},
        {Year: '2Y', Type: 'TypeA', Value: -11928080380},
        {Year: '3Y', Type: 'TypeA', Value: 32370503415}
    ],
    H4: [
        {Year: '1Y', Type: 'TypeA', Value: -41445643364},
        {Year: '2Y', Type: 'TypeB', Value: -11928080380},
        {Year: '3Y', Type: 'TypeA', Value: 32370503415},
        {Year: '4Y', Type: 'TypeA', Value: 32370503415}
    ]
};

需要生成如下格式的新对象:

{
    H1: [
        {Year: '1Y', Type: 'TypeA', Value: -41445643364},
        {Year: '2Y', Type: 'TypeA', Value: -11928080380},
        {Year: '3Y', Type: 'TypeA', Value: 32370503415},
        {Year: '4Y', Type: '-', Value: 0}
    ],
    H2: [
        {Year: '1Y', Type: '-', Value: 0},
        {Year: '2Y', Type: '-', Value: 0},
        {Year: '3Y', Type: '-', Value: 0},
        {Year: '4Y', Type: '-', Value: 0}
    ],
    H3: [
        {Year: '1Y', Type: '-', Value: 0},
        {Year: '2Y', Type: '-', Value: 0},
        {Year: '3Y', Type: '-', Value: 0},
        {Year: '4Y', Type: '-', Value: 0}
    ],
    H4: [
        {Year: '1Y', Type: 'TypeA', Value: -41445643364},
        {Year: '2Y', Type: 'TypeB', Value: -11928080380},
        {Year: '3Y', Type: 'TypeA', Value: 32370503415},
        {Year: '4Y', Type: 'TypeA', Value: 32370503415}
    ]
}

已考虑初始化空对象let dict_ = { 'H1': [], 'H2': [], 'H3': [], 'H4': [] },希望通过循环填充数据。

实现方案

通过遍历表头+年份匹配映射的方式实现,代码简洁且高效:

const headr = ['H1', 'H2', 'H3', 'H4'];
const Year = ['1Y', '2Y', '3Y', '4Y'];
let arr_ = {
    H1: [
        {Year: '1Y', Type: 'TypeA', Value: -41445643364},
        {Year: '2Y', Type: 'TypeA', Value: -11928080380},
        {Year: '3Y', Type: 'TypeA', Value: 32370503415}
    ],
    H4: [
        {Year: '1Y', Type: 'TypeA', Value: -41445643364},
        {Year: '2Y', Type: 'TypeB', Value: -11928080380},
        {Year: '3Y', Type: 'TypeA', Value: 32370503415},
        {Year: '4Y', Type: 'TypeA', Value: 32370503415}
    ]
};

// 初始化结果对象
const result = {};

// 遍历每个表头
headr.forEach(header => {
    // 获取当前表头的已有数据,无数据则用空数组
    const existingItems = arr_[header] || [];
    // 将已有数据转为以年份为键的Map,快速匹配查找
    const yearMap = new Map(existingItems.map(item => [item.Year, item]));
    
    // 遍历年份数组,生成对应元素
    result[header] = Year.map(year => {
        // 优先取已有数据,无数据则生成默认值对象
        return yearMap.get(year) || { Year: year, Type: '-', Value: 0 };
    });
});

console.log(result);

代码说明

  1. 用Map存储已有数据的年份映射,查找效率为O(1),比循环遍历更高效
  2. 自动处理arr_中不存在的表头(如H2、H3),直接生成全默认值数组
  3. 通过forEach+map组合遍历,代码逻辑清晰易维护

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 16:40:39