递归数组中,根据特征ID,返回该级下的一个字段

问题描述

数据是一颗递归树
需要根据唯一健url找出该url下的name

问题出现的环境背景及自己尝试过哪些方法

相关代码

// 请把代码文本粘贴到下方(请勿用图片代替代码)


[{
    "menuUrl":1,
    "name":"666",
    "menuList":[{
        "menuUrl":3,
        "name":"hhaha",
        "menuList":[{
            "menuUrl":8,
            "name":"jajja",
            "menuList":[]
            }]
    }]

},{
    "menuUrl":88,
    "name":"ksls",
    "menuList":[{
        "menuUrl":55,
        "name":6,
        "menuList":[]
    }]

}]


findNameByUrl(menuUrl,data)==>return name

比如我findNameByUrl(8,data)期望得到jajja

阅读 2.9k
5 个回答

不是很优雅,主要部分:

let result;

function findNameByUrl(arr, url) {
    //每个同级别节点遍历
    arr.forEach(element => {
        if (element.menuUrl == url) {
            //找到之后赋值到结果
            result = element.name;
        }else if (element.menuList) {
            //不然如果有下级,递归遍历下级
            findNameByUrl(element.menuList, url);
        }
    });
}

完整可测试代码:

let arr = [{
    "menuUrl": 1,
    "name": "666",
    "menuList": [{
        "menuUrl": 3,
        "name": "hhaha",
        "menuList": [{
            "menuUrl": 8,
            "name": "jajja",
            "menuList": []
        }]
    }]

}, {
    "menuUrl": 88,
    "name": "ksls",
    "menuList": [{
        "menuUrl": 55,
        "name": 6,
        "menuList": []
    }]

}];

let result;

function findNameByUrl(arr, url) {
    //每个同级别节点遍历
    arr.forEach(element => {
        if (element.menuUrl == url) {
            //找到之后赋值到结果
            result = element.name;
        }else if (element.menuList) {
            //不然如果有下级,递归遍历下级
            findNameByUrl(element.menuList, url);
        }
    });
}

findNameByUrl(arr, 8);
console.log(result);
let arr = [{
    "menuUrl": 1,
    "name": "666",
    "menuList": [{
        "menuUrl": 3,
        "name": "hhaha",
        "menuList": [{
            "menuUrl": 8,
            "name": "jajja",
            "menuList": []
        }]
    }]

}, {
    "menuUrl": 88,
    "name": "ksls",
    "menuList": [{
        "menuUrl": 55,
        "name": 6,
        "menuList": []
    }]

}]

let crr = [];
let str = 8;

function Fn(arr, callback, crr) {
    arr.forEach(element => {
        for (let key in element) {
            if (key === "menuList") {
                Fn(element[key], callback, crr);
            } else {
                if (key === "menuUrl") {
                    if (callback(element[key])) {
                        crr.push(element[key]);
                    }
                }
            }
        }
    });
    return crr;

}

Fn(arr, function(data) {

    if (data === str) {
        return true;
    }
}, crr);

console.log(crr);
let data = [{
    "menuUrl": 1,
    "name": "666",
    "menuList": [{
        "menuUrl": 3,
        "name": "hhaha",
        "menuList": [{
            "menuUrl": 8,
            "name": "jajja",
            "menuList": []
        }]
    }]

}, {
    "menuUrl": 88,
    "name": "ksls",
    "menuList": [{
        "menuUrl": 55,
        "name": 6,
        "menuList": []
    }]

}]

function findNameByUrl(url, data) {
    return data.find(ele => {
        if (ele.menuList.length) {
            findNameByUrl(url, ele.menuList)
        }
        return ele.menuUrl === url
    })
}
let _r = findNameByUrl(88, data)
console.log(_r.name)
function findName(str, data) {
    let findResult = '';
    for (var i in data) {
        if (str == data[i].menuUrl) {
            findResult = data[i].name;
            break;
        }

        if (data[i].menuList && data[i].menuList.length > 0) {
            findResult = findName(str, data[i].menuList);
            if (findResult != '') {
                break;
            }
        }
    }

    return findResult;
}

console.log(findName(88, data));
var data = [{
    "menuUrl": 1,
    "name": "666",
    "menuList": [{
        "menuUrl": 3,
        "name": "hhaha",
        "menuList": [{
            "menuUrl": 8,
            "name": "jajja",
            "menuList": []
        }]
    }]

}, {
    "menuUrl": 88,
    "name": "ksls",
    "menuList": [{
        "menuUrl": 55,
        "name": 6,
        "menuList": []
    }]

}];

function findNameByUrl(url, data) {
    var s = JSON.stringify(data), ss = s.split('menuUrl":' + url + ',"name":');
    if (ss.length == 2) {
        var x = ss[1], y = x.substr(0, x.indexOf(','));
        if (y[0] == '"') {
            y = y.substr(1, y.length - 2);
        }
        return y;
    }
}

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