JavaScript 数组递归查找对应的id象返回 数组 中断查找
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
    </head>
    <body>
        <script type="text/javascript">
            const fuck = [{"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": [] } ]
            console.log(fuck)
            /**
             * 深度递归搜索
             * @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(fuck, (item, index, level) => item.value === 63, 'children')
            console.log(20181115092957, myarr)  // [{…}, {…}, {…}]
            console.log(20181115092957, myarr.map(_ => _.value)) // [32, 58, 63]
        </script>
    </body>
</html>


我是马丁的车夫,欢迎转发收藏!


 

posted on 2020-12-26 14:06  马丁的车夫  阅读(686)  评论(0编辑  收藏  举报