递归替换写法

<!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>

运行结果如下

 

posted on 2022-04-17 21:07  走调的钢琴  阅读(102)  评论(0)    收藏  举报