遍历嵌套对象数组,过滤保留含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);
代码解释
- 过滤阶段:使用
filter结合Object.values和some,判断当前模块是否存在至少一个权限的custom_checked为true,只保留这类模块。 - 转换阶段:对每个保留的模块,遍历其
permissions的键值对:- 用
filter筛选出custom_checked为true的权限项 - 用
reduce将这些项整理成新的permissions对象,只保留custom_checked: true的结构
- 用
- 最后返回包含处理后
permissions的新对象,避免修改原数组。
内容的提问来源于stack exchange,提问作者Kaung Khant Zaw
相关产品推荐
相关产品推荐

