我有一个复杂的 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
})
}
}
}
});
}
}
});
有更好的方法吗?
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>