如何基于给定列表在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);
代码说明
- 用
Map存储已有数据的年份映射,查找效率为O(1),比循环遍历更高效 - 自动处理
arr_中不存在的表头(如H2、H3),直接生成全默认值数组 - 通过
forEach+map组合遍历,代码逻辑清晰易维护
内容的提问来源于stack exchange,提问作者AfterFray
相关产品推荐
相关产品推荐

