编码技巧收集一~ 获取树结构某子节点的所有父节点

206 阅读1分钟

需求描述:

树形结构的数据,获取子节点的所有父级节点方法,

思路:

循环节点,判断是否是默认节点,是则保存到数组,否则判断是否有子节点,有则调用本身循环,并进行数组合并,没有子节点就重置数组并进入下一个循环,直到查到指定默认节点时,返回数组。

代码:

var res = [
    {
        "value": "pk",
        "label": "北京市",
        "children": {
            "name": "block",
            "label": "请选择",
            "options": [
                {
                    "value": "hd",
                    "label": "海淀区"
          },
                {
                    "value": "cp",
                    "label": "昌平区"
          },
                {
                    "value": "cy",
                    "label": "朝阳区"
          }
        ]
        }
    },
    {
        "value": "sc",
        "label": "四川省",
        "children": {
            "name": "city",
            "label": "请选择",
            "options": [
                {
                    "value": "cd",
                    "label": "成都市",
                    "children": {
                        "name": "block",
                        "label": "请选择",
                        "options": [
                            {
                                "value": "gx",
                                "label": "高新区"
                },
                            {
                                "value": "qy",
                                "label": "青羊区"
                }
              ]
                    }
          },
                {
                    "value": "my",
                    "label": "绵阳市",
                    "children": {
                        "name": "block",
                        "label": "请选择",
                        "options": [
                            {
                                "value": "jn",
                                "label": "金牛区"
                }
              ]
                    }
          },
                {
                    "value": "lz",
                    "label": "泸州市"
          },
                {
                    "value": "dy",
                    "label": "德阳市"
          },
                {
                    "value": "ms",
                    "label": "眉山市"
          },
                {
                    "value": "ls",
                    "label": "乐山市"
          },
                {
                    "value": "yb",
                    "label": "宜宾市"
          },
                {
                    "value": "ya",
                    "label": "雅安市"
          },
                {
                    "value": "zg",
                    "label": "自贡市"
          },
                {
                    "value": "pzh",
                    "label": "攀枝花市"
          },
                {
                    "value": "sn",
                    "label": "遂宁市"
          },
                {
                    "value": "nc",
                    "label": "南充市"
          },
                {
                    "value": "nj",
                    "label": "内江市"
          },
                {
                    "value": "dz",
                    "label": "达州市"
          },
                {
                    "value": "ga",
                    "label": "广安市"
          }
        ]
        }
    }
  ]

function treeFindPath(tree, func, path = []) {
    if (!tree) return []
    for (const index in tree) {
        console.log(111, tree[index], func(tree[index]))
        // 这里按照你的需求来存放最后返回的内容吧
        path.push(tree[index].value)
        if (func(tree[index])) {
            return path
        }
        if (tree[index].children) {
            const findChildren = treeFindPath(tree[index].children.options, func, path)
            if (findChildren.length) return findChildren
        }
        path.pop()
    }
    return []
}

//调用
let path = []
path = treeFindPath(res, data => data.value === 'jn')