js json对象从子级找最外层父级怎么找,有方法吗

父级找子集直接点就行了,子集找父级呢?怎么操作

let arrn=[
        {
            "MENU_URL": "dashboard",
            "MENU_ID": "104a580029c54e139210b7e87dca6d89",
            "MENU_NAME": "监控面板"
        },
        {
            "MENU_URL": "systemManage",
            "MENU_ID": "769130d1918d47219e6f0c463a1c9c67",
            "MENU_NAME": "系统管理"
        },
        {
            "MENU_URL": "serviceManage",
            "MENU_ID": "8619ca0b6fbc42649a27475e339d5d4a",
            "MENU_INFO": [
                {
                    "MENU_URL": "userInfo",
                    "MENU_ID": "104a580029c54e139210b7e87dca6d89",
                    "MENU_NAME": "三户信息"
                }
            ],
            "MENU_NAME": "业务管理"
        },
        {
            "MENU_URL": "serviceManage/recordQuery",
            "MENU_ID": "d379e3f38cb3472ab18287034f32ef46",
            "MENU_INFO": [
                {
                    "MENU_URL": "dashboard",
                    "MENU_ID": "104a580029c54e139210b7e87dca6d80",
                    "MENU_INFO": [
                        {
                            "MENU_URL": "dashboard",
                            "MENU_ID": "454a580029c54e139210b7e87dca6d82",
                            "MENU_NAME": "监控面板222"
                        }
                    ],
                    "MENU_NAME": "监控面板111"
                },
                {
                    "MENU_URL": "dashboard",
                    "MENU_ID": "104a580029c54e139210b7e87dca6d89",
                    "MENU_NAME": "监控面板333"
                }
            ],
            "MENU_NAME": "订购信息查询"
        }
    ]
知道监控面板222的MENU_ID,要找到最外层的MENU_ID


现在写了一个能从第二级找到第一级
```
function getParentId(childId) {
    tmparr.forEach(function (item, index) {
        if (item.MENU_INFO) {
            item.MENU_INFO.forEach(function (list, idx) {
                if (list.MENU_ID === childId) {
                    console.log('d', item)
                }
            })
        }
    })
}
getParentId('104a580029c54e139210b7e87dca6d80')
```
有没有高手可以改造一下,用递归什么的,查不定级数的
阅读 6.4k
4 个回答

递归遍历

function findParentById(arr,id){
    var parentId = '没有父元素',
    hasParentId = function loop(arr){
        return arr.some((item)=>{
            if(item.MENU_ID === id){
                return true
            }else if(Array.isArray(item.MENU_INFO)){
                parentId = item.MENU_ID
                return loop(item.MENU_INFO)
            }else{
                return false
            }
        })
    }(arr)
    return hasParentId ? parentId : '未找到对应父元素'
}

function findParentsById(arr,id){
    var parentIds = [],
        index = 0,
    hasParentId = function loop(arr, index){
        return arr.some((item)=>{
            if(item.MENU_ID === id){
                parentIds = parentIds.slice(0, index)
                return true
            }else if(Array.isArray(item.MENU_INFO)){
                parentIds[index] = item.MENU_ID
                return loop(item.MENU_INFO, index+1)
            }else{
                return false
            }
        })
    }(arr, index)
    return hasParentId ? parentIds : []
}

findParentById(arrn, '454a580029c54e139210b7e87dca6d82');//"104a580029c54e139210b7e87dca6d80"
findParentsById(arrn, '454a580029c54e139210b7e87dca6d82');
//["d379e3f38cb3472ab18287034f32ef46", "104a580029c54e139210b7e87dca6d80"]

这里用104a580029c54e139210b7e87dca6d89测试,发现一直找不到,最后看到你id很对重复的,比如第一条数据的id也是这个,那么这只是你的测试数据还是数据就是这样的可以重复?如果可以重复那上面的代码就需要改下,不过都是递归

有个很巧的办法:把Menu对应的数组对象arrn转成字符串,然后使用正则查找,异常轻松,可以适配无限深的层级。

function findTopParent(menuJson, childId) {
   let menuStr = JSON.stringify(menuJson);
   let reg = new RegExp('MENU_ID":"([^"]+)"[^\\}\\]]+MENU_ID":"' + childId);
   return reg.test(menuStr) ? menuStr.match(reg)[1]: undefined;
}

findTopParent(arrn, '104a580029c54e139210b7e87dca6d89');  //返回8619ca0b6fbc42649a27475e339d5d4a
findTopParent(arrn, '454a580029c54e139210b7e87dca6d82');  //返回d379e3f38cb3472ab18287034f32ef46

你怎么拿到子集的?子集去掉点后面的不就是父级。

可以找到父id,可能是我描述有问题,我是想找最外层父id

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题