鍍金池/ 問(wèn)答/Java  HTML/ js json樹(shù)形對(duì)象從子級(jí)找所有外層父級(jí)ID怎么找?

js json樹(shù)形對(duì)象從子級(jí)找所有外層父級(jí)ID怎么找?

let arrn=[
        {
            "MENU_URL": "dashboard",
            "MENU_ID": "104a580029c54e139210b7e87dca6d82",
            "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": "104a580029c54e139210b7e87dca6d87",
                    "MENU_NAME": "三戶信息"
                }
            ],
            "MENU_NAME": "業(yè)務(wù)管理"
        },
        {
            "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": "訂購(gòu)信息查詢"
        }
    ]

這是一個(gè)不定級(jí)嵌套的樹(shù)形json,之前問(wèn)了某位大牛,找到了最外層,無(wú)奈水平有限,無(wú)法參透,現(xiàn)在需要把所有父ID都找出來(lái),放到數(shù)組里。
回答
編輯回答
款爺

JS 里的對(duì)象不具備向上溯源的功能,只能你自己構(gòu)建一個(gè)數(shù)據(jù)結(jié)構(gòu)了。

2018年4月13日 23:11
編輯回答
墨沫

去年回答過(guò)類似問(wèn)題,戳此,你只需要將方法中的屬性變成你需要的屬性即可。 那個(gè)方法返回完成路徑數(shù)組,即 [父,父,父,子],你需要父元素?cái)?shù)組只需去掉最后一個(gè)元素。

再送一個(gè)針對(duì)這個(gè)問(wèn)題的字符串實(shí)現(xiàn),返回結(jié)果是數(shù)組 [父,爺,...]

function findTopParents(menuJson, childId, result) {
    result = result || [];
    let menuStr = typeof menuJson === "string" ? menuJson : JSON.stringify(menuJson);
    let reg = new RegExp('MENU_ID":"([^"]+)"[^\\}\\]\\[\\{]+\\[\\{[^\\}\\]\\[\\{]+MENU_ID":"' + childId);

    if(reg.test(menuStr)) {
        result.push(menuStr.match(reg)[1]);
           return findTopParents(menuStr, menuStr.match(reg)[1], result);
   } else {
           return result;
   }
}

var ret = findTopParents(arrn, '454a580029c54e139210b7e87dca6d82');
console.log(ret); // ["104a580029c54e139210b7e87dca6d80", "d379e3f38cb3472ab18287034f32ef46"]
2017年10月30日 13:46
編輯回答
淚染裳

如果格式就是這樣的話沒(méi)辦法,只能靠遍歷。你可以構(gòu)建的時(shí)候講層級(jí)和parentId都作為一個(gè)屬性能方便以后使用

2018年9月23日 13:06
編輯回答
雨萌萌
 function generateID(arr){
    if(Array.isArray(arr)){
        return arr.map(item => {
            let temp = [];
            temp.push(item.MENU_ID);
            if(item.MENU_INFO){
                temp.push(generateID(item.MENU_INFO));
            }
                return temp;
        });
    }
}

let result = generateID(arrn);

result.map(item => {
    return item.join(',').split(',');
})

得到的結(jié)果:可以在里面再進(jìn)行過(guò)濾
[Array(1), Array(1), Array(2), Array(4)]
0: ["104a580029c54e139210b7e87dca6d82"]
1: ["769130d1918d47219e6f0c463a1c9c67"]
2: (2)?["8619ca0b6fbc42649a27475e339d5d4a", "104a580029c54e139210b7e87dca6d87"]
3: (4)?["d379e3f38cb3472ab18287034f32ef46", "104a580029c54e139210b7e87dca6d80", "454a580029c54e139210b7e87dca6d82", "104a580029c54e139210b7e87dca6d89"]
length: 4
__proto__: Array(0)

如果不需要最后一條子項(xiàng)可以delete掉,然后把空數(shù)組過(guò)濾掉,或者改判斷條件

2017年6月2日 22:18