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

如何在深度嵌套对象中按指定Key筛选目标值?(含ID白名单筛选场景)

解决深度嵌套对象按指定Key筛选的问题

我来帮你搞定这个嵌套对象的筛选问题!你的需求是保留allowed数组里指定ID的节点,同时维持正确的嵌套结构,原函数的问题出在递归处理children的逻辑上——你错误地把所有节点的children都挂到了外层结果对象上,而不是每个对应节点的内部,而且没处理子节点为空的情况。

原函数的核心问题

  • 在reduce回调里,你返回的{ ...obj, [key]: routers[key], children: ... }会把children直接添加到外层对象,而不是嵌套进当前的routers[key]节点中,这就导致结构完全混乱了。
  • 没有处理子节点筛选后为空的场景,比如原节点3不在allowed里,筛选后应该把父节点2的children设为[],而不是继续递归返回空对象。

修正后的筛选函数

const filtered = (allowed, routers) => {
  // 筛选当前层级符合条件的节点Key
  return Object.keys(routers)
    .filter(key => allowed.includes(key))
    .reduce((resultObj, key) => {
      // 复制当前节点的所有属性,避免修改原数据
      const currentNode = { ...routers[key] };
      
      // 处理子节点逻辑
      if (currentNode.children) {
        // 递归筛选子节点
        const filteredChildNodes = filtered(allowed, currentNode.children);
        // 如果筛选后没有子节点,设为[];否则保留筛选后的结构
        currentNode.children = Object.keys(filteredChildNodes).length ? filteredChildNodes : [];
      } else {
        // 原本没有children的节点,统一设为[]
        currentNode.children = [];
      }
      
      // 将处理好的节点加入结果对象
      resultObj[key] = currentNode;
      return resultObj;
    }, {});
};

函数逻辑说明

  1. 当前层级筛选:先过滤出ID在allowed数组中的节点Key。
  2. 节点属性复制:用扩展运算符复制原节点的属性,避免直接修改原routers对象。
  3. 子节点递归处理:
    • 如果当前节点有children,递归调用筛选函数处理子节点。
    • 检查筛选后的子节点是否为空对象,为空则把children设为[],保证结构统一。
  4. 空children处理:对于原本没有children的节点,直接设置为[],和你期望的结果格式一致。

调用这个函数后,你就能得到完全符合预期的嵌套结构:

{
  "1": {
    "menuid": 1,
    "title": "1",
    "children": {
      "2": {
        "menuid": 2,
        "title": "2",
        "children": []
      }
    }
  },
  "4": {
    "menuid": 4,
    "title": "4",
    "children": []
  },
  "20": {
    "menuid": 20,
    "title": "20",
    "children": []
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 03:27:41