如何提取深度嵌套JSON对象中所有层级的categoryId值
问题原因
你写的代码存在3个核心问题:
- 没有主动收集每一层分类自身的
categoryId,只遍历了子分类的内容,导致顶层分类id直接丢失 - 硬编码了4层遍历逻辑,只能适配固定深度的分类结构,后续如果出现更深层级的分类会直接漏数据
- 字段名大小写不匹配:原JSON结构的子分类字段是
subcategories(首字母小写c),你代码中写成了subCategories(首字母大写C),会导致无法正确读取子分类数据
解决方案
推荐用递归实现,不受分类嵌套深度限制,兼容性更强:
// 递归提取所有分类id const getAllCategoryIds = (categoryList) => { let ids = [] for (const category of categoryList) { // 先存入当前分类的id ids.push(category.categoryId) // 如果存在子分类,递归提取子分类的id合并到结果 if (Array.isArray(category.subcategories) && category.subcategories.length) { ids = ids.concat(getAllCategoryIds(category.subcategories)) } } return ids } // 调用后转成逗号分隔的字符串 const result = getAllCategoryIds(json).join(',')
如果需要精简的单行实现,可以用reduce配合递归完成:
const result = json.reduce(function fn(acc, cur) { return acc.concat(cur.categoryId, cur.subcategories?.reduce(fn, []) || []) }, []).join(',')
两种实现最终输出的结果都是1,2,3,4,5,6,符合需求。
内容的提问来源于stack exchange,提问作者Adhyatmik
相关产品推荐
相关产品推荐

