如何将扁平二维数组转换为嵌套对象?初学者求实现方案
数组转嵌套分类对象实现方案
直接上可运行的JavaScript代码,能完美实现你要的嵌套分类结构:
const newCat = [ ["Grocery", "Food & Drink", "Snacks, Crisps and Sweets"], ["Grocery", "Canned, Dry & Packaged Food", "Pickled Foods"], ["Grocery", "Food & Drink"], ["Grocery", "Food & Drink", "Nuts, Dates & Dried Fruits"], ["Grocery", "World Specialities", "India"], ]; function buildNestedCategories(arr) { const result = []; arr.forEach(categoryPath => { let currentLevel = result; categoryPath.forEach((name, index) => { // 检查当前层级是否已有同名分类 let existingCategory = currentLevel.find(item => item.CategoryName === name); if (!existingCategory) { // 不存在则新建分类对象,仅非最后一级添加SubCategories existingCategory = { CategoryName: name }; if (index !== categoryPath.length - 1) { existingCategory.SubCategories = []; } currentLevel.push(existingCategory); } // 切换到下一层级(如果有子分类的话) currentLevel = existingCategory.SubCategories || []; }); }); return result; } // 生成嵌套结构 const nestedCategories = buildNestedCategories(newCat); // 格式化输出查看结果 console.log(JSON.stringify(nestedCategories, null, 2));
代码逻辑拆解
- 初始化容器:
result数组用来存放最顶层的分类(比如示例里的"Grocery")。 - 遍历每条分类路径:对每个层级数组(比如
["Grocery", "Food & Drink", ...])进行处理。 - 层级追踪:用
currentLevel变量记录当前操作的分类层级,从根目录开始逐步深入。 - 检查并创建分类:
- 用
find方法检查当前层级是否已有同名分类,避免重复创建。 - 新建分类时,只有当该分类不是路径的最后一级时,才添加
SubCategories空数组(最后一级分类没有子分类)。
- 用
- 层级切换:处理完当前分类后,把
currentLevel切换到该分类的SubCategories,继续处理下一级分类。
运行代码后,你会得到完整的嵌套结构,包含所有示例里的分类,比如"World Specialities"和对应的"India",以及"Food & Drink"下的"Nuts, Dates & Dried Fruits"都会被正确添加进去。
内容的提问来源于stack exchange,提问作者Ravi Vishwakarma
相关产品推荐
相关产品推荐

