记录--js数组递归深度查询

const findArr = [{"label": "占用道路问题", "value": 31, "children": [{"label": "经营占道", "value": 35, "children": [{"label": "店外经营占道", "value": 40, "children": null }, {"label": "流动摊贩占道", "value": 41, "children": null } ] }, {"label": "垃圾占道", "value": 36, "children": [{"label": "生活垃圾", "value": 42, "children": null }, {"label": "建筑垃圾", "value": 43, "children": null }, {"label": "工业垃圾", "value": 44, "children": null } ] }, {"label": "车辆占道", "value": 37, "children": [{"label": "机动车占道", "value": 45, "children": null }, {"label": "非机动车占道", "value": 46, "children": null } ] }, {"label": "霸占车位", "value": 38, "children": [] }, {"label": "其他占道", "value": 39, "children": [] } ]}, {"label": "“两违”问题", "value": 32, "children": [{"label": "违法建筑", "value": 58, "children": [{"label": "房屋违建", "value": 61, "children": null }, {"label": "小区违建", "value": 62, "children": null }, {"label": "违建棚架", "value": 63, "children": null } ] }, {"label": "违法用地", "value": 59, "children": [] }, {"label": "其他违建", "value": 60, "children": [] } ] }, {"label": "市容设施管理问题", "value": 33, "children": [{"label": "道路损坏", "value": 47, "children": [] }, {"label": "垃圾桶损坏", "value": 48, "children": [] }, {"label": "下水道堵塞", "value": 49, "children": [] }, {"label": "井盖损坏", "value": 50, "children": [] }, {"label": "路灯损坏", "value": 51, "children": [] }, {"label": "树木修剪", "value": 52, "children": [] }, {"label": "水电气", "value": 53, "children": [] }, {"label": "户外广告牌", "value": 54, "children": [] }, {"label": "隔音屏损坏", "value": 55, "children": [] }, {"label": "洒水车问题", "value": 56, "children": [] }, {"label": "其他", "value": 57, "children": [] } ] }, {"label": "其他问题", "value": 34, "children": [] } ]

/**
 * 深度递归搜索
 * @param {Array} arr 你要搜索的数组
 * @param {Function} condition 回调函数,必须返回谓词,判断是否找到了。会传入(item, index, level)三个参数
 * @param {String} children 子数组的key
 */
const deepFind = (arr, condition, children) => {
    // 即将返回的数组
    let main = []

    // 用try方案方便直接中止所有递归的程序
    try {
        // 开始轮询
        (function poll(arr, level) {
            // 如果传入非数组
            if (!Array.isArray(arr)) return

            // 遍历数组
            for (let i = 0; i < arr.length; i++) {
                // 获取当前项
                const item = arr[i]

                // 先占位预设值
                main[level] = item

                // 检验是否已经找到了
                const isFind = condition && condition(item, i, level) || false

                // 如果已经找到了
                if (isFind) {
                    // 直接抛出错误中断所有轮询
                    throw Error

                // 如果存在children,那么深入递归
                } else if (children && item[children] && item[children].length) {
                    poll(item[children], level + 1)

                // 如果是最后一个且没有找到值,那么通过修改数组长度来删除当前项
                } else if (i === arr.length - 1) {
                   // 删除占位预设值
                   main.length = main.length - 1
                }
            }
        })(arr, 0)
    // 使用try/catch是为了中止所有轮询中的任务
    } catch (err) {}

    // 返回最终数组
    return main
}

let myarr = deepFind(findArr, (item, index, level) => item.value === 63, 'children')
console.log(20181115092957, myarr)  // [{…}, {…}, {…}]
console.log(20181115092957, myarr.map(_ => _.value)) // [32, 58, 63]
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
获取树形数据的递归算法可以使用深度优先遍历(DFS)或广度优先遍历(BFS)。以下是使用 DFS 的实现示例: ```javascript function getTreeList(treeData, parentId = null) { const result = []; for (let i = 0; i < treeData.length; i++) { const node = treeData[i]; if (node.parentId === parentId) { const children = getTreeList(treeData, node.id); if (children.length) { node.children = children; } result.push(node); } } return result; } ``` 其中,`treeData` 是原始的树形数据,`parentId` 是当前节点的父节点 ID。首先创建一个空数组 `result`,然后遍历原始数据,找到所有父节点 ID 为当前节点 ID 的子节点,并递归获取子节点的子节点,直到没有子节点为止。如果当前节点有子节点,则将子节点数组添加到当前节点的 `children` 属性中,最后将当前节点添加到 `result` 数组中并返回。 使用示例: ```javascript const treeData = [ { id: 1, name: 'Node 1', parentId: null }, { id: 2, name: 'Node 2', parentId: 1 }, { id: 3, name: 'Node 3', parentId: 1 }, { id: 4, name: 'Node 4', parentId: 2 }, { id: 5, name: 'Node 5', parentId: 3 }, { id: 6, name: 'Node 6', parentId: null }, { id: 7, name: 'Node 7', parentId: 6 }, ]; const treeList = getTreeList(treeData); console.log(treeList); ``` 输出结果: ``` [ { "id": 1, "name": "Node 1", "parentId": null, "children": [ { "id": 2, "name": "Node 2", "parentId": 1, "children": [ { "id": 4, "name": "Node 4", "parentId": 2 } ] }, { "id": 3, "name": "Node 3", "parentId": 1, "children": [ { "id": 5, "name": "Node 5", "parentId": 3 } ] } ] }, { "id": 6, "name": "Node 6", "parentId": null, "children": [ { "id": 7, "name": "Node 7", "parentId": 6 } ] } ] ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值