JavaScript嵌套数组遍历:将复杂数组转换为指定结构
解决方案:合并嵌套数组生成目标结构
实现思路
核心是将原数组中CLASS和Mass两个条目下的benefits数据进行合并:
- 先提取两类数据的核心内容;
- 以
interest项的name为唯一标识,合并对应数值; - 组装顶层的限制值和合并后的
interest数组,生成目标结构。
代码实现
function transformArray(arr) { // 提取CLASS和Mass对应的cover数据 const classData = arr.find(item => item.name === 'CLASS')?.cover?.[0]; const massData = arr.find(item => item.name === 'Mass')?.cover?.[0]; // 容错处理:如果任一数据缺失则返回空数组 if (!classData || !massData) return []; // 用Map存储interest项,以name作为唯一键 const interestMap = new Map(); // 存入CLASS的interest数据 classData.interest.forEach(interestItem => { interestMap.set(interestItem.name, { name: interestItem.name, classLimits: interestItem.limits[0].defaultValue }); }); // 补充Mass的interest数据 massData.interest.forEach(interestItem => { const existingItem = interestMap.get(interestItem.name); if (existingItem) { existingItem.massLimits = interestItem.limits[0].defaultValue; } }); // 生成最终结果 return [{ name: classData.name, interest: Array.from(interestMap.values()), classLimit: classData.limits[0].defaultValue, massLimit: massData.limits[0].defaultValue }]; } // 测试用原数组 const arr = [ { "name": "CLASS", "cover": [ { "name": "benefits", "interest": [ { "name": "one", "limits": [{ "defaultValue": 200 }] }, { "name": "two", "limits": [{ "defaultValue": 300 }] } ], "limits": [{ "defaultValue": "Y" }] } ] }, { "name": "Mass", "cover": [ { "name": "benefits", "interest": [ { "name": "one", "limits": [{ "defaultValue": 300 }] }, { "name": "two", "limits": [{ "defaultValue": 500 }] } ], "limits": [{ "defaultValue": "Y" }] } ] } ]; // 调用函数得到结果 const output = transformArray(arr); console.log(output);
逻辑说明
- 数据提取:使用
Array.find精准定位CLASS和Mass条目,通过可选链?.避免数据缺失导致的报错; - 合并interest:利用
Map的键唯一性,确保相同name的interest项被合并,分别赋值classLimits和massLimits; - 容错处理:提前判断核心数据是否存在,避免后续操作抛出异常;
- 结果组装:将合并后的
interest数组与顶层限制值整合,生成符合要求的输出结构。
内容的提问来源于stack exchange,提问作者Atal Shrivastava
相关产品推荐
相关产品推荐

