You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Reducer中如何将分类数组过滤为树形结构?

解决嵌套分类的子分类收集问题

我来帮你搞定这个嵌套分类的问题!你的需求是把最多3层嵌套的分类里所有子分类都存入options数组,核心问题应该是现有代码只处理了浅层子分类,没触达深层的嵌套项。下面给你一套清晰的解决思路和代码示例:

第一步:给分类做分组映射

先把所有分类按parent ID做分组,这样能快速定位任意父分类对应的子分类,不用每次遍历整个数组找子项,效率更高:

// 在你的reducer中处理拿到的categories数组
const categoryMap = categories.reduce((acc, category) => {
  // 把parent转为字符串,避免数字/字符串类型不匹配的问题
  const parentKey = String(category.parent);
  if (!acc[parentKey]) {
    acc[parentKey] = [];
  }
  acc[parentKey].push(category);
  return acc;
}, {});

第二步:递归遍历收集所有嵌套子分类

因为最多嵌套3层,咱们写一个递归函数,从顶级分类(parent=0)开始逐层遍历,把每一层的子分类都收集到options里,还能给标签加上层级路径(比如「Year 3 > 数学 > 进阶班」这种结构):

// 递归收集子分类的函数,currentLevel控制层级上限(最多3层)
function collectNestedOptions(parentId, currentLevel, parentLabel = '') {
  // 获取当前父分类的所有子分类
  const children = categoryMap[String(parentId)] || [];
  // 超过3层就停止递归
  if (currentLevel > 3) return [];

  return children.flatMap(child => {
    // 生成带层级的标签(不需要层级的话直接用child.name即可)
    const currentLabel = parentLabel ? `${parentLabel} > ${child.name}` : child.name;
    // 先把当前子分类加入结果,再递归处理它的子分类
    return [
      { value: child.id, label: currentLabel },
      ...collectNestedOptions(child.id, currentLevel + 1, currentLabel)
    ];
  });
}

// 初始化options:从顶级分类(parent=0)开始,当前层级为1
const options = collectNestedOptions(0, 1);

方案为啥能解决问题?

你之前的代码应该只处理了parent=0的直接子分类,没有往下递归查找深层嵌套项。这个递归函数会自动遍历到第三层,把所有嵌套的子分类都捞出来,还能灵活保留层级关系,完全匹配你要的结构。

内容的提问来源于stack exchange,提问作者Bomber

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:29:34