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
相关产品推荐
相关产品推荐

