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

如何在JavaScript中合并同类型对象数组的重复数据

扁平分类数据转嵌套层级结构的JavaScript解决方案

问题描述

我从API获取到如下扁平结构的对象数组:

[{"id":1,"slugId":14,"slugname":"CONGRESS HOLI","slugimage":"add_slug-1662283679686-280515336.png","catId":43,"Catname":"Festivals","Catimage":"add_cat-1662283486801-298957699.png","subcatId":17,"Subcatname":"Holi","Subcatimage":"add_sub_cat-1662283535813-230624577.png","status":"Y","createOn":"2022-09-22T09:28:58.000Z"},{"id":2,"slugId":16,"slugname":"Businessman style","slugimage":"add_slug-1663051353073-877731686.png","catId":43,"Catname":"Festivals","Catimage":"add_cat-1662283486801-298957699.png","subcatId":17,"Subcatname":"Holi","Subcatimage":"add_sub_cat-1662283535813-230624577.png","status":"Y","createOn":"2022-09-22T09:28:58.000Z"},{"id":3,"slugId":18,"slugname":" 5 years experience developer","slugimage":"add_slug-1663051690656-634079210.png","catId":43,"Catname":"Festivals","Catimage":"add_cat-1662283486801-298957699.png","subcatId":17,"Subcatname":"Holi","Subcatimage":"add_sub_cat-1662283535813-230624577.png","status":"Y","createOn":"2022-09-22T09:28:58.000Z"},{"id":4,"slugId":17,"slugname":"Freshers celebration","slugimage":"add_slug-1663051623567-10970673.png","catId":43,"Catname":"Festivals","Catimage":"add_cat-1662283486801-298957699.png","subcatId":17,"Subcatname":"Holi","Subcatimage":"add_sub_cat-1662283535813-230624577.png","status":"Y","createOn":"2022-09-22T09:28:58.000Z"},{"id":5,"slugId":15,"slugname":"BJP HOLI","slugimage":"add_slug-1662283691843-48171334.png","catId":43,"Catname":"Festivals","Catimage":"add_cat-1662283486801-298957699.png","subcatId":17,"Subcatname":"Holi","Subcatimage":"add_sub_cat-1662283535813-230624577.png","status":"Y","createOn":"2022-09-22T09:28:58.000Z"},{"id":6,"slugId":16,"slugname":"Businessman style","slugimage":"add_slug-1663051353073-877731686.png","catId":44,"Catname":"International Programmer's day","Catimage":"add_cat-1663050093974-896633895.png","subcatId":19,"Subcatname":"Programmers celibration","Subcatimage":"add_sub_cat-1663050763025-692632444.png","status":"Y","createOn":"2022-09-22T09:29:17.000Z"},{"id":7,"slugId":17,"slugname":"Freshers celebration","slugimage":"add_slug-1663051623567-10970673.png","catId":44,"Catname":"International Programmer's day","Catimage":"add_cat-1663050093974-896633895.png","subcatId":19,"Subcatname":"Programmers celibration","Subcatimage":"add_sub_cat-1663050763025-692632444.png","status":"Y","createOn":"2022-09-22T09:29:17.000Z"},{"id":8,"slugId":16,"slugname":"Businessman style","slugimage":"add_slug-1663051353073-877731686.png","catId":43,"Catname":"Festivals","Catimage":"add_cat-1662283486801-298957699.png","subcatId":18,"Subcatname":"Businessman ","Subcatimage":"add_sub_cat-1663050461884-351806552.png","status":"Y","createOn":"2022-09-22T09:29:37.000Z"},{"id":11,"slugId":14,"slugname":"CONGRESS HOLI","slugimage":"add_slug-1662283679686-280515336.png","catId":43,"Catname":"Festivals","Catimage":"add_cat-1662283486801-298957699.png","subcatId":19,"Subcatname":"Programmers celibration","Subcatimage":"add_sub_cat-1663050763025-692632444.png","status":"Y","createOn":"2022-09-22T09:44:04.000Z"},{"id":12,"slugId":15,"slugname":"BJP HOLI","slugimage":"add_slug-1662283691843-48171334.png","catId":43,"Catname":"Festivals","Catimage":"add_cat-1662283486801-298957699.png","subcatId":19,"Subcatname":"Programmers celibration","Subcatimage":"add_sub_cat-1663050763025-692632444.png","status":"Y","createOn":"2022-09-22T09:44:04.000Z"},{"id":13,"slugId":16,"slugname":"Businessman style","slugimage":"add_slug-1663051353073-877731686.png","catId":43,"Catname":"Festivals","Catimage":"add_cat-1662283486801-298957699.png","subcatId":19,"Subcatname":"Programmers celibration","Subcatimage":"add_sub_cat-1663050763025-692632444.png","status":"Y","createOn":"2022-09-22T09:44:04.000Z"},{"id":14,"slugId":14,"slugname":"CONGRESS HOLI","slugimage":"add_slug-1662283679686-280515336.png","catId":43,"Catname":"Festivals","Catimage":"add_cat-1662283486801-298957699.png","subcatId":20,"Subcatname":"Developer celebration ","Subcatimage":"add_sub_cat-1663051456339-307987347.png","status":"Y","createOn":"2022-09-22T09:44:34.000Z"},{"id":15,"slugId":17,"slugname":"Freshers celebration","slugimage":"add_slug-1663051623567-10970673.png","catId":43,"Catname":"Festivals","Catimage":"add_cat-1662283486801-298957699.png","subcatId":20,"Subcatname":"Developer celebration ","Subcatimage":"add_sub_cat-1663051456339-307987347.png","status":"Y","createOn":"2022-09-22T09:44:34.000Z"},{"id":16,"slugId":16,"slugname":"Businessman style","slugimage":"add_slug-1663051353073-877731686.png","catId":43,"Catname":"Festivals","Catimage":"add_cat-1662283486801-298957699.png","subcatId":20,"Subcatname":"Developer celebration ","Subcatimage":"add_sub_cat-1663051456339-307987347.png","status":"Y","createOn":"2022-09-22T09:44:34.000Z"}]

该数组将分类(cat)、子分类(subcat)、标签(slug)的信息存储在单个对象中,包含catId、Catimage、subcatId、slugId等字段。需要将其转换为如下嵌套层级结构,把相同分类的数据合并到对应层级:

[{"id":1,"catId":43,"Catname":"Festivals","Catimage":"add_cat-1662283486801-298957699.png","status":"Y","createOn":"2022-09-22T09:28:58.000Z","subcat-details":[{"subcatId":17,"Subcatname":"Holi","Subcatimage":"add_sub_cat-1662283535813-230624577.png","slug-details":[{"slugId":14,"slugname":"CONGRESS HOLI","slugimage":"add_slug-1662283679686-280515336.png"},{"slugId":16,"slugname":"Businessman style","slugimage":"add_slug-1663051353073-877731686.png"},{"slugId":18,"slugname":" 5 years experience developer","slugimage":"add_slug-1663051690656-634079210.png"},{"slugId":17,"slugname":"Freshers celebration","slugimage":"add_slug-1663051623567-10970673.png"},{"slugId":15,"slugname":"BJP HOLI","slugimage":"add_slug-1662283691843-48171334.png"}]},{"subcatId":20,"Subcatname":"Developer celebration ","Subcatimage":"add_sub_cat-1663051456339-307987347.png","slug-details":[{"slugId":14,"slugname":"CONGRESS HOLI","slugimage":"add_slug-1662283679686-280515336.png"},{"slugId":17,"slugname":"Freshers celebration","slugimage":"add_slug-1663051623567-10970673.png"},{"slugId":16,"slugname":"Businessman style","slugimage":"add_slug-1663051353073-877731686.png"}]},{"subcatId":18,"Subcatname":"Businessman ","Subcatimage":"add_sub_cat-1663050461884-351806552.png","slug-details":[{"slugId":16,"slugname":"Businessman style","slugimage":"add_slug-1663051353073-877731686.png"}]},{"subcatId":19,"Subcatname":"Programmers celibration","Subcatimage":"add_sub_cat-1663050763025-692632444.png","slug-details":[{"slugId":14,"slugname":"CONGRESS HOLI","slugimage":"add_slug-1662283679686-280515336.png"},{"slugId":15,"slugname":"BJP HOLI","slugimage":"add_slug-1662283691843-48171334.png"},{"slugId":16,"slugname":"Businessman style","slugimage":"add_slug-1663051353073-877731686.png"}]}]},{"id":6,"catId":44,"Catname":"International Programmer's day","Catimage":"add_cat-1663050093974-896633895.png","status":"Y","createOn":"2022-09-22T09:29:17.000Z","subcat-details":[{"subcatId":19,"Subcatname":"Programmers celibration","Subcatimage":"add_sub_cat-1663050763025-692632444.png","slug-details":[{"slugId":16,"slugname":"Businessman style","slugimage":"add_slug-1663051353073-877731686.png"},{"slugId":17,"slugname":"Freshers celebration","slugimage":"add_slug-1663051623567-10970673.png"}]}]}]

解决方案

通过遍历扁平数组,利用对象作为映射表跟踪已创建的分类和子分类,逐层构建嵌套结构,代码如下:

function transformFlatData(flatData) {
  // 用对象存储已处理的分类,key为catId
  const categoryMap = {};

  flatData.forEach(item => {
    // 1. 处理分类层级
    let category = categoryMap[item.catId];
    if (!category) {
      // 创建新的分类对象,提取分类相关字段
      category = {
        id: item.id,
        catId: item.catId,
        Catname: item.Catname,
        Catimage: item.Catimage,
        status: item.status,
        createOn: item.createOn,
        'subcat-details': []
      };
      categoryMap[item.catId] = category;
    }

    // 2. 处理子分类层级
    let subcategory = category['subcat-details'].find(sc => sc.subcatId === item.subcatId);
    if (!subcategory) {
      // 创建新的子分类对象,提取子分类相关字段
      subcategory = {
        subcatId: item.subcatId,
        Subcatname: item.Subcatname,
        Subcatimage: item.Subcatimage,
        'slug-details': []
      };
      category['subcat-details'].push(subcategory);
    }

    // 3. 处理标签层级,检查是否已存在相同slugId的标签(避免重复)
    const existingSlug = subcategory['slug-details'].find(s => s.slugId === item.slugId);
    if (!existingSlug) {
      // 创建新的标签对象,提取标签相关字段
      const slug = {
        slugId: item.slugId,
        slugname: item.slugname,
        slugimage: item.slugimage
      };
      subcategory['slug-details'].push(slug);
    }
相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 09:00:50