PHP递归过滤多维数组:按键值对筛选层级元素
递归实现多层嵌套数组的条件过滤
针对多层嵌套数组(层级不限)的canView条件过滤需求,我们可以通过递归遍历的方式实现——只要当前元素满足canView: true,就继续递归处理其子数组;若当前元素不满足,则直接丢弃(连带其子元素一起排除),确保最终结果只保留自身及所有父级canView均为true的元素。
核心代码实现(JavaScript)
function filterArray(arr) { // 先筛选当前层级中canView为true的元素 return arr.filter(item => item.canView).map(item => { // 检查当前元素是否有子数组,存在则递归处理 if (item.child && Array.isArray(item.child)) { return { ...item, child: filterArray(item.child) }; } // 无子女数组则返回浅拷贝的元素,避免修改原数据 return { ...item }; }); }
代码逻辑说明
- 层级筛选:通过
filter直接排除当前层级中canView为false的元素,这些元素的子元素也会被一并排除,符合需求。 - 递归处理子数组:对每个通过筛选的元素,判断是否存在
child数组,若存在则递归调用filterArray处理子数组,替换原有的child属性。 - 数据纯净性:使用扩展运算符
...浅拷贝元素,避免修改原始数组,防止副作用。
示例验证
输入数组
const originalData = [ { id: 1, canView: true, child: [ { id: 11, canView: true, child: [ { id: 111, canView: false }, { id: 112, canView: true } ] }, { id: 12, canView: false, child: [{ id: 121, canView: true }] } ] }, { id: 2, canView: false, child: [{ id: 21, canView: true }] } ];
调用函数后输出
[ { id: 1, canView: true, child: [ { id: 11, canView: true, child: [ { id: 112, canView: true } ] } ] } ]
注意事项
- 无论嵌套层级是3层还是50层,递归逻辑都会自动处理所有子节点,无需手动指定层级。
- 如果你的子数组键名不是
child,只需将代码中的item.child替换为实际键名即可。 - 若需处理深层复杂对象的拷贝,可根据需求将浅拷贝替换为深拷贝(如使用
JSON.parse(JSON.stringify(item))或专门的深拷贝工具函数)。
内容的提问来源于stack exchange,提问作者Hùng Thái
相关产品推荐
相关产品推荐

