js json树形对象从子级找所有外层父级ID怎么找?

let arrn=[
        {
            "MENU_URL": "dashboard",
            "MENU_ID": "104a580029c54e139210b7e87dca6d82",
            "MENU_NAME": "监控面板"
        },
        {
            "MENU_URL": "systemManage",
            "MENU_ID": "769130d1918d47219e6f0c463a1c9c67",
            "MENU_NAME": "系统管理"
        },
        {
            "MENU_URL": "serviceManage",
            "MENU_ID": "8619ca0b6fbc42649a27475e339d5d4a",
            "MENU_INFO": [
                {
                    "MENU_URL": "userInfo",
                    "MENU_ID": "104a580029c54e139210b7e87dca6d87",
                    "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": "订购信息查询"
        }
    ]

这是一个不定级嵌套的树形json,之前问了某位大牛,找到了最外层,无奈水平有限,无法参透,现在需要把所有父ID都找出来,放到数组里。
阅读 11.2k
4 个回答

去年回答过类似问题,戳此,你只需要将方法中的属性变成你需要的属性即可。 那个方法返回完成路径数组,即 [父,父,父,子],你需要父元素数组只需去掉最后一个元素。

再送一个针对这个问题的字符串实现,返回结果是数组 [父,爷,...]

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"]
 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(',');
})

得到的结果:可以在里面再进行过滤
[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)

如果不需要最后一条子项可以delete掉,然后把空数组过滤掉,或者改判断条件

JS 里的对象不具备向上溯源的功能,只能你自己构建一个数据结构了。

如果格式就是这样的话没办法,只能靠遍历。你可以构建的时候讲层级和parentId都作为一个属性能方便以后使用

推荐问题
宣传栏