如何在深度嵌套对象中按指定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; }, {}); };
函数逻辑说明
- 当前层级筛选:先过滤出ID在
allowed数组中的节点Key。 - 节点属性复制:用扩展运算符复制原节点的属性,避免直接修改原
routers对象。 - 子节点递归处理:
- 如果当前节点有
children,递归调用筛选函数处理子节点。 - 检查筛选后的子节点是否为空对象,为空则把
children设为[],保证结构统一。
- 如果当前节点有
- 空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
相关产品推荐
相关产品推荐

