JSUtils – 递归查找指定条件子节点

2020-08-20 1,197 0

根据以下数据来看,层级大致为 [国家->省份->城市],是一个三级的树结构。在应用中,我们可能只会使用到里面的valueparent字段关联父子关系。
所以就有了一种场景:根据节点value,我们需要拿到它上级所有父节点,此时我们使用普通的遍历是实现不了的,这里得用递归实现。

const data = [{
    "value": 13,
    "label": "加拿大",
    "parent": 0,
    "children": [{
        "value": 14,
        "label": "不列颠哥伦比亚",
        "parent": 13,
        "children": [{
            "value": 15,
            "label": "温哥华",
            "parent": 14
        }]
    }]
}, {
    "value": 8,
    "label": "中国",
    "parent": 0,
    "children": [{
        "value": 9,
        "label": "上海",
        "parent": 8,
        "children": [{
            "value": 10,
            "label": "上海",
            "parent": 9
        }]
    }]
}]

递归函数

递归学习路线:https://www.jianshu.com/p/e1c0faeca43c

const findChildrenNodes = function(data, id){
    //定义变量保存当前结果路径
    var temppath = [];
    try {
        data.forEach((item) => {
        function getNodePath(node) {
            //存储节点
            temppath.push(node.value);
            //找到符合条件的节点,通过throw终止掉递归
            if (node.value == parseInt(id)) {
                throw "OUT";
            }
            if (node.children && node.children.length > 0) {
                for (var i = 0; i < node.children.length; i++) {
                    getNodePath(node.children[i]);
                }
                //当前节点的子节点遍历完依旧没找到,则删除路径中的该节点
                temppath.pop();
            } else {
                //找到叶子节点时,删除路径当中的该叶子节点
                temppath.pop();
            }
        }
        getNodePath(item);
        });
    } catch (e) {
        return temppath;
    }
    return temppath;
}

相关文章

JSUtils – 自定义EventEmitter
Request – 文件流下载