按层级键合并分组对象数组并生成嵌套子结构的实现需求
解决方案
可以通过层级分组+迭代构建嵌套结构实现需求,核心思路是按「国家→年份→月份→运动」的维度逐步分组,再将分组结果转换为指定的嵌套格式。
代码实现
const original = [ { Country: 'Asia', Year: 2021, Month: 'January', Sport: 'Football' }, { Country: 'Asia', Year: 2021, Month: 'March', Sport: 'Basketball' }, { Country: 'Asia', Year: 2022, Month: 'May', Sport: 'Basketball' }, { Country: 'Europe', Year: 2022, Month: 'June', Sport: 'Basketball' }, { Country: 'Europe', Year: 2022, Month: 'October', Sport: 'Volley' }, ]; // 国家缩写映射表 const countryCodeMap = { Asia: 'AS', Europe: 'EU' }; // 构建嵌套结构 function buildNestedStructure(data) { const cache = {}; data.forEach(item => { const { Country, Year, Month, Sport } = item; const yearStr = String(Year); // 1. 处理国家层级 if (!cache[Country]) { cache[Country] = { code: countryCodeMap[Country], name: Country, childs: [] }; } const countryNode = cache[Country]; // 2. 处理年份层级 let yearNode = countryNode.childs.find(node => node.name === yearStr); if (!yearNode) { yearNode = { code: `${countryNode.code}_${yearStr}`, name: yearStr, childs: [] }; countryNode.childs.push(yearNode); } // 3. 处理月份层级 let monthNode = yearNode.childs.find(node => node.name === Month); if (!monthNode) { monthNode = { code: `${yearNode.code}_${Month}`, name: Month, childs: [] }; yearNode.childs.push(monthNode); } // 4. 处理运动层级 const sportNode = { code: `${monthNode.code}_${Sport}`, name: Sport }; monthNode.childs.push(sportNode); }); // 将缓存对象转换为数组 return Object.values(cache); } const result = buildNestedStructure(original); console.log(result);
代码说明
- 国家缩写映射:提前定义
countryCodeMap,将国家名称映射为对应缩写,用于生成层级code。 - 缓存对象:用
cache临时存储每个国家的根节点,避免重复创建相同层级的节点。 - 层级构建逻辑:
- 遍历每个数据项,依次检查「国家→年份→月份」层级是否已存在对应节点,不存在则创建并添加到父节点的
childs数组。 - 最后创建运动节点,直接添加到对应月份的
childs数组。
- 遍历每个数据项,依次检查「国家→年份→月份」层级是否已存在对应节点,不存在则创建并添加到父节点的
- 结果转换:将缓存对象的所有值提取为数组,得到最终的嵌套结构。
扩展提示
如果后续需要调整层级顺序(比如改为「年份→国家→月份」),只需修改遍历层级的顺序和code生成规则;新增国家时,在countryCodeMap中添加对应缩写映射即可。
内容的提问来源于stack exchange,提问作者Erlangga Hendrika
相关产品推荐
相关产品推荐

