JavaScript中按新键名动态合并对象数组的方案求助
动态合并多组日期数据并重命名value字段
问题描述
给定一个包含多组对象数组的数组A(子数组数量不固定):
const A = [ [{date: '2022-12-05', value: 10.6}, {date: '2022-12-06', value: 5.6}, {date: '2022-12-07', value: 8.6}], [{date: '2022-12-05', value: 4.2}, {date: '2022-12-06', value: 12.3}, {date: '2022-12-07', value: 9.5}], [{date: '2022-12-05', value: 5.6}, {date: '2022-12-06', value: 9.8}, {date: '2022-12-07', value: 7.8}] ];
需要将其转换为按日期合并的数组B,把原value键按子数组序号重命名为value1、value2……:
const B = [ {date: '2022-12-05', value1: 10.6, value2: 4.2, value3: 5.6}, {date: '2022-12-06', value1: 5.6, value2: 12.3, value3: 9.8}, {date: '2022-12-07', value1: 8.6, value2: 9.5, value3: 7.8} ];
解决方案
利用Map高效按日期分组,动态适配任意数量的子数组,实现代码如下:
function transformArray(A) { const dateMap = new Map(); A.forEach((subArray, index) => { const valueKey = `value${index + 1}`; subArray.forEach(item => { // 首次遇到该日期时初始化对象 if (!dateMap.has(item.date)) { dateMap.set(item.date, { date: item.date }); } // 将当前子数组的value按序号重命名后合并 dateMap.get(item.date)[valueKey] = item.value; }); }); // 将Map中的值转换为数组返回 return Array.from(dateMap.values()); } // 测试示例 const A = [ [{date: '2022-12-05', value: 10.6}, {date: '2022-12-06', value: 5.6}, {date: '2022-12-07', value: 8.6}], [{date: '2022-12-05', value: 4.2}, {date: '2022-12-06', value: 12.3}, {date: '2022-12-07', value: 9.5}], [{date: '2022-12-05', value: 5.6}, {date: '2022-12-06', value: 9.8}, {date: '2022-12-07', value: 7.8}] ]; const B = transformArray(A); console.log(B);
关键说明
- 自动适配子数组数量:无论
A中有1组还是多组子数组,都会生成对应的valueN键 - 高效分组:使用
Map保证时间复杂度为O(n)(n为A中所有对象的总数) - 自动初始化:每个日期对象仅创建一次,避免重复操作
内容的提问来源于stack exchange,提问作者Richo
相关产品推荐
相关产品推荐

