鍍金池/ 問答/Java  HTML/ js json對象從子級找最外層父級怎么找,有方法嗎

js json對象從子級找最外層父級怎么找,有方法嗎

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

let arrn=[
        {
            "MENU_URL": "dashboard",
            "MENU_ID": "104a580029c54e139210b7e87dca6d89",
            "MENU_NAME": "監(jiān)控面板"
        },
        {
            "MENU_URL": "systemManage",
            "MENU_ID": "769130d1918d47219e6f0c463a1c9c67",
            "MENU_NAME": "系統(tǒng)管理"
        },
        {
            "MENU_URL": "serviceManage",
            "MENU_ID": "8619ca0b6fbc42649a27475e339d5d4a",
            "MENU_INFO": [
                {
                    "MENU_URL": "userInfo",
                    "MENU_ID": "104a580029c54e139210b7e87dca6d89",
                    "MENU_NAME": "三戶信息"
                }
            ],
            "MENU_NAME": "業(yè)務管理"
        },
        {
            "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": "監(jiān)控面板222"
                        }
                    ],
                    "MENU_NAME": "監(jiān)控面板111"
                },
                {
                    "MENU_URL": "dashboard",
                    "MENU_ID": "104a580029c54e139210b7e87dca6d89",
                    "MENU_NAME": "監(jiān)控面板333"
                }
            ],
            "MENU_NAME": "訂購信息查詢"
        }
    ]
知道監(jiān)控面板222的MENU_ID,要找到最外層的MENU_ID


現(xiàn)在寫了一個能從第二級找到第一級
```
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')
```
有沒有高手可以改造一下,用遞歸什么的,查不定級數(shù)的
回答
編輯回答
玩控

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

2018年4月17日 22:35
編輯回答
卟乖

可以找到父id,可能是我描述有問題,我是想找最外層父id

2018年8月21日 18:26
編輯回答
膽怯

有個很巧的辦法:把Menu對應的數(shù)組對象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
2017年7月28日 06:00
編輯回答
憶當年

遞歸遍歷

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測試,發(fā)現(xiàn)一直找不到,最后看到你id很對重復的,比如第一條數(shù)據(jù)的id也是這個,那么這只是你的測試數(shù)據(jù)還是數(shù)據(jù)就是這樣的可以重復?如果可以重復那上面的代碼就需要改下,不過都是遞歸

2017年3月23日 17:06