重构电商分类与子分类的JavaScript对象数组
将扁平电商分类数组转换为层级嵌套结构
要实现把带parentId的扁平分类数组转换成嵌套结构(根分类parentId为空,子分类归入父分类的subCategories数组),可以用基于Map的高效方案,支持任意深度的嵌套:
实现代码
function nestCategories(flatCategories) { const categoryMap = new Map(); const nestedCategories = []; // 将所有分类存入Map,同时初始化subCategories数组 flatCategories.forEach(category => { categoryMap.set(category.id, { ...category, subCategories: [] }); }); // 遍历分类,将子分类归入对应父分类的subCategories flatCategories.forEach(category => { const current = categoryMap.get(category.id); if (category.parentId === '') { nestedCategories.push(current); } else { const parent = categoryMap.get(category.parentId); if (parent) { parent.subCategories.push(current); } } }); return nestedCategories; } // 测试输入 const inputCategories = [ {id:1, name:'Electronics', parentId:''}, {id:2, name:'Devices', parentId:1}, {id:3, name:'Mobile Phones', parentId:2}, {id:4, name:'TV', parentId:2}, {id:5, name:'Accessories', parentId:1}, {id:6, name:'Beauty', parentId:''}, ]; // 生成嵌套结果 const nestedCategories = nestCategories(inputCategories); console.log(nestedCategories);
代码说明
- Map存储优化:用
Map存储所有分类,key为分类id,查找父分类的时间复杂度为O(1),比遍历数组查找高效得多,尤其适合大量分类的场景。 - 初始化subCategories:复制原分类对象并添加空的
subCategories数组,避免后续判断数组是否存在。 - 构建嵌套结构:
- 根分类(
parentId为空)直接加入结果数组。 - 非根分类通过
parentId找到父分类,将自身添加到父分类的subCategories中。
- 根分类(
支持深层嵌套
如果新增分类{id:7, name:'Smart TV', parentId:4},运行代码后该分类会自动归入id:4(TV)的subCategories数组中,完美支持多层级嵌套。
内容的提问来源于stack exchange,提问作者kazi nur hossain tipu
相关产品推荐
相关产品推荐

