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

JavaScript如何实现n层级嵌套对象数组按endDate字段过滤

JavaScript 无限层级嵌套对象数组过滤实现方案

实现思路

  • 采用递归处理嵌套的subTasks字段,不受具体嵌套层级限制,支持任意n级深度
  • 节点保留逻辑:当前节点自身符合过滤条件(存在endDate字段),或其子节点中存在符合条件的节点(需保留父级层级结构)
  • 不修改原始数据,所有操作基于对象浅拷贝实现,避免副作用

完整实现代码

const sampleData= [{       
  "rowId": "3.0.0",
  "startDate": "2020-10-20",
  "subTasks": [                 
      {                
          "rowId": "3.3.0",
          "startDate": "2021-05-26",             
          "subTasks": [
              {
                  "rowId": "3.3.0.1",
                  "startDate": "2021-05-26",                        
                  "subTasks": []
              },
              {
                  "rowId": "3.3.0.2",
                  "startDate": "2021-06-09",
                  "endDate": "2021-07-23",  
                  "subTasks": []                      
              },                   
          ]
      },           
  ]
}]

// 递归过滤函数
function filterNestedTasks(tasks) {
  return tasks.reduce((result, current) => {
    // 先递归处理当前节点的子任务
    const filteredSubTasks = filterNestedTasks(current.subTasks || [])
    // 构造当前节点的拷贝,替换为过滤后的子任务
    const currentCopy = {
      ...current,
      subTasks: filteredSubTasks
    }
    // 判断是否保留当前节点:自身有endDate 或 有符合条件的子节点
    if (current.endDate || filteredSubTasks.length > 0) {
      result.push(currentCopy)
    }
    return result
  }, [])
}

const filtered = filterNestedTasks(sampleData)
console.log("过滤结果", JSON.stringify(filtered, null, 2))

输出结果说明

运行上述代码后,会保留完整层级结构,符合你需要的rowId: "3.3.0.2"节点会被完整保留:

[
  {
    "rowId": "3.0.0",
    "startDate": "2020-10-20",
    "subTasks": [
      {
        "rowId": "3.3.0",
        "startDate": "2021-05-26",
        "subTasks": [
          {
            "rowId": "3.3.0.2",
            "startDate": "2021-06-09",
            "endDate": "2021-07-23",
            "subTasks": []
          }
        ]
      }
    ]
  }
]

可选:直接提取所有符合条件的节点(拍平结构)

如果你不需要保留层级,只需要拿到所有存在endDate的节点,可以用以下版本:

function flatFilterNestedTasks(tasks, result = []) {
  tasks.forEach(current => {
    if (current.endDate) {
      result.push(current)
    }
    if (current.subTasks?.length > 0) {
      flatFilterNestedTasks(current.subTasks, result)
    }
  })
  return result
}

// 调用后直接得到包含rowId: "3.3.0.2"的数组
const flatFiltered = flatFilterNestedTasks(sampleData)

内容的提问来源于stack exchange,提问作者VBC

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 02:54:04