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

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 };
  });
}

代码逻辑说明

  1. 层级筛选:通过filter直接排除当前层级中canView为false的元素,这些元素的子元素也会被一并排除,符合需求。
  2. 递归处理子数组:对每个通过筛选的元素,判断是否存在child数组,若存在则递归调用filterArray处理子数组,替换原有的child属性。
  3. 数据纯净性:使用扩展运算符...浅拷贝元素,避免修改原始数组,防止副作用。

示例验证

输入数组

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 17:18:14