递归替换写法
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>递归替代</title> </head> <body> <script> /** * 需求:查询树中,所有带a的节点返回 */ const data = [ { id: 1, name: "a", pid: -1 }, { id: 11, name: "b", pid: 1 }, { id: 12, name: "c", pid: 1 }, { id: 111, name: "d", pid: 11 }, { id: 112, name: "aa", pid: 11 }, { id: 113, name: "aB", pid: 11 }, { id: 121, name: "ad", pid: 12 }, { id: 122, name: "e", pid: 12 }, { id: 123, name: "f", pid: 12 } ]; const nodes1 = filterNodes1(data, -1, "a"); console.log("递归过滤", nodes1); const nodes2 = filterNodes2(data, -1, "a"); console.log("函数过滤", nodes2) // 递归写法 function filterNodes1(data, pid, keyword) { let nodes = data.filter(item => item.pid == pid); let result = nodes.filter(item => item.name.indexOf(keyword) != -1); nodes.forEach(item => result.push(...filterNodes1(data, item.id, keyword))); return result; } // 函数写法 function filterNodes2(data, pid, keyword) { let nodes = [{ id: pid }]; let result = []; do { let current = nodes.splice(0, 1); let children = data.filter(item => item.pid == current[0].id); nodes.push(...children); result.push(...children.filter(item => item.name.indexOf(keyword) != -1)); } while (nodes.length > 0) return result; } </script> </body> </html>
运行结果如下

浙公网安备 33010602011771号