递归替换写法
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>
运行结果如下