使用Javascript将对象数组转换为深层树数组

问题描述 投票:0回答:1

我有一个复杂的 json 文件,我必须使用 javascript 处理该文件以使其分层。我正在尝试将对象数组转换为深度嵌套数组。可以有任意数量的 divNames 以及任意数量的类别和子类别

对象数组:

[{
   divName: "ABC",
   divId: 123,
   catName: "XYZ",
   catId: 456,
   subCatName: "PQR"
   subCatId: 781
},
{
   divName: "ABC",
   divId: 123,
   catName: "YQP",
   catId: 281,
   subCatName: "FYI"
   subCatId: 231
},
{
   divName: "ABC",
   divId: 123,
   catName: "XYZ",
   catId: 456,
   subCatName: "YAB"
   subCatId: 587
}
]

预期输出:

[{divName: "ABC",
  divId: 123
  categories: [
     {
       catName: "XYZ".
       catId: 456,
       subCategories: [
         {
            subCatName: "PQR",
            subCatID: 781
         },
         {
            subCatName: "YAB",
            subCatID: 587
         }],
     {
       catName: "YQP"
       catId: 281,
       subCategories: [
         {
           subCatName: "FYI"
           subCatID: 231
         }
       ]
     }]
  ]

这是我到目前为止所拥有的:

nonCompetitorData.map((data, idx) => {
            if(idx === 0) {
                downloadData.push({"divisionName": data.divisionName, "divisionId": data.divisionId});
            } else {
                if (!downloadData[0].categories) {
                    downloadData[0].categories = [];
                    downloadData[0].categories.push({
                        "categoryName": data.categoryName,
                        "categoryId": data.categoryId
                    })
                } else {
                    if(downloadData[0].categories) {
                        if(!downloadData[0].categories.some(c => c.categoryName === data.categoryName)) {
                            downloadData[0].categories.push({
                                "categoryName": data.categoryName,
                                "categoryId": data.categoryId
                            })
                        }
                    }
                    downloadData[0].categories.forEach((cat, i) => {
                        if(!cat.subCategories) {
                            console.log("Categories",downloadData[0].categories[i]);
                            downloadData[0].categories[i].subCategories = [];
                            downloadData[0].categories[i].subCategories.push({
                                "subCategoryName": data.subCategoryName,
                                "subCategoryId": data.subCategoryId
                            });
                        } else {
                            if(cat.subCategories) {
                                if(!cat.subCategories.some(c => c.subCategoryName === data.subCategoryName)) {
                                    downloadData[0].categories[i].subCategories.push({
                                        "subCategoryName": data.subCategoryName,
                                        "subCategoryId": data.subCategoryId
                                    })
                                }
                            }
                        }
                    });
                }
            }
        });

有更好的方法吗?

javascript arrays data-structures filter tree
1个回答
0
投票

const r = arr.reduce((map => (r, {divId,divName,catId,catName,subCatId,subCatName}) => {
  const div = map[divId]??=r[r.length]={divName,divId, categories:[]};
  const cat = map[catId]??=div.categories[div.categories.length]={catId,catName,subcategories:[]};
  cat.subcategories.push({subCatId, subCatName});
  return r;
})({}), []);

console.log(r);
  
<script>
const arr = [{
   divName: "ABC",
   divId: 123,
   catName: "XYZ",
   catId: 456,
   subCatName: "PQR",
   subCatId: 781
},
{
   divName: "ABC",
   divId: 123,
   catName: "YQP",
   catId: 281,
   subCatName: "FYI",
   subCatId: 231
},
{
   divName: "ABC",
   divId: 123,
   catName: "XYZ",
   catId: 456,
   subCatName: "YAB",
   subCatId: 587
}
]
</script>

© www.soinside.com 2019 - 2024. All rights reserved.