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

遍历嵌套对象数组,过滤保留含custom_checked:true的对象

问题解决:过滤并整理权限数组

需求说明

原始权限数组如下:

[
  {
    id: 1,
    name: "dashboard",
    permissions: {
      view: {
        default_checked: false,
        custom_checked: true,
      },
      add: {
        default_checked: false,
        custom_checked: true,
      },
    },
  },
  {
    id: 2,
    name: "user",
    permissions: {
      view: {
        default_checked: false,
        custom_checked: true,
      },
      add: {
        default_checked: false,
        custom_checked: false,
      },
    },
  },
  {
    id: 3,
    name: "contact",
    permissions: {
      view: {
        default_checked: false,
        custom_checked: false,
      },
      add: {
        default_checked: false,
        custom_checked: false,
      },
    },
  },
]

需要实现两个目标:

  • 过滤掉permissions中所有子对象custom_checked都为false的数组元素(比如id为3的元素)
  • 保留的元素中,移除permissions里custom_checked为false的子对象,同时只保留子对象的custom_checked字段

期望结果:

[
  {
    id: 1,
    name: "dashboard",
    permissions: {
      view: {
        custom_checked: true,
      },
      add: {
        custom_checked: true,
      },
    },
  },
  {
    id: 2,
    name: "user",
    permissions: {
      view: {
        custom_checked: true,
      },
    },
  },
]

原代码问题分析

你原来的代码在遍历permissions的每个子对象时,每找到一个custom_checked: true的项就直接往数组里push一个新对象,导致每个符合条件的权限项都生成了单独的对象,而不是把同一个模块的所有符合条件的权限合并到一个对象里。

正确实现代码

可以通过Array.filter先过滤出符合条件的模块,再用Array.map处理每个模块的permissions:

const arr = [/* 原始数组内容 */];

const result = arr
  .filter(item => {
    // 检查当前模块是否有至少一个权限的custom_checked为true
    return Object.values(item.permissions).some(perm => perm.custom_checked);
  })
  .map(item => {
    // 处理permissions,只保留custom_checked为true的项,且只保留该字段
    const filteredPermissions = Object.entries(item.permissions)
      .filter(([key, perm]) => perm.custom_checked)
      .reduce((acc, [key]) => {
        acc[key] = { custom_checked: true };
        return acc;
      }, {});
    
    return {
      ...item,
      permissions: filteredPermissions
    };
  });

console.log(result);

代码解释

  1. 过滤阶段:使用filter结合Object.values和some,判断当前模块是否存在至少一个权限的custom_checked为true,只保留这类模块。
  2. 转换阶段:对每个保留的模块,遍历其permissions的键值对:
    • 用filter筛选出custom_checked为true的权限项
    • 用reduce将这些项整理成新的permissions对象,只保留custom_checked: true的结构
  3. 最后返回包含处理后permissions的新对象,避免修改原数组。

内容的提问来源于stack exchange,提问作者Kaung Khant Zaw

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 08:45:26