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

按层级键合并分组对象数组并生成嵌套子结构的实现需求

解决方案

可以通过层级分组+迭代构建嵌套结构实现需求,核心思路是按「国家→年份→月份→运动」的维度逐步分组,再将分组结果转换为指定的嵌套格式。

代码实现

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);

代码说明

  1. 国家缩写映射:提前定义countryCodeMap,将国家名称映射为对应缩写,用于生成层级code。
  2. 缓存对象:用cache临时存储每个国家的根节点,避免重复创建相同层级的节点。
  3. 层级构建逻辑:
    • 遍历每个数据项,依次检查「国家→年份→月份」层级是否已存在对应节点,不存在则创建并添加到父节点的childs数组。
    • 最后创建运动节点,直接添加到对应月份的childs数组。
  4. 结果转换:将缓存对象的所有值提取为数组,得到最终的嵌套结构。

扩展提示

如果后续需要调整层级顺序(比如改为「年份→国家→月份」),只需修改遍历层级的顺序和code生成规则;新增国家时,在countryCodeMap中添加对应缩写映射即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 12:58:01