如何将对象数组转换为统一格式的嵌套对象数组(JavaScript)
问题描述
需要将如下结构的JavaScript对象数组:
const input = [ { group: { id: "group1", groupName: "Group1" }, categories: [ { id: "category11", categoryName: "Category 11", subCategories: [] } ] }, { group: { id: "group2", groupName: "Group 2" }, categories: [ { id: "category21", categoryName: "Category 21", subCategories: [] }, { id: "category22", categoryName: "Category 22", subCategories: [ { id: "category221", categoryName: "Category 221", subCategories: [] } ] } ] } ];
转换为统一使用key、name、categories字段的嵌套对象数组,目标格式如下:
const output = [ { key: "group1", name: "Group1", categories: [ { key: "category11", name: "Category 11", categories: [] } ] }, { key: "group2", name: "Group 2", categories: [ { key: "category21", name: "Category 21", categories: [] }, { key: "category22", name: "Category 22", categories: [ { key: "category221", name: "Category 221", categories: [] } ] } ] } ];
目前已实现第一层格式转换,但无法处理深层嵌套结构,现有代码:
const output = arr.map((item) => { return { key: item.group.id, name: item.group.groupName, categories: [{ ...item }] }; });
解决方案
可以通过递归函数处理所有层级的嵌套转换,具体实现如下:
// 定义递归函数,处理单个分类/子分类的转换 function convertCategory(category) { return { key: category.id, name: category.categoryName, // 递归处理子分类,将subCategories转为categories categories: category.subCategories.map(convertCategory) }; } // 处理根节点数组 const output = input.map(item => ({ key: item.group.id, name: item.group.groupName, // 调用递归函数转换所有分类 categories: item.categories.map(convertCategory) }));
代码说明:
convertCategory函数:接收单个分类对象,将其id转为key,categoryName转为name,并递归处理subCategories数组,将每个子分类转换后存入categories字段。- 根节点处理:遍历原数组,将每个根节点的
group.id和group.groupName映射为key和name,再用convertCategory转换整个categories数组。
这样就能完整处理所有层级的嵌套结构,得到符合要求的输出。
内容的提问来源于stack exchange,提问作者user16860065
相关产品推荐
相关产品推荐

