Javascript 搜索嵌套对象并返回整个路径

Javascript 搜索嵌套对象并返回整个路径,javascript,json,object,underscore.js,lodash,Javascript,Json,Object,Underscore.js,Lodash,我有下面的JavaScript和n个级别的子项,我想搜索id,如果其中的任何项具有匹配的id,那么需要将对象从根返回到匹配的项 我想返回找到的项的整个层次结构,从根到对象及其子对象 我尝试使用lodash和下划线,但找不到简单的解决方案 输入:{ “儿童”:[{ “姓名”:“家”, “头衔”:“家”, “id”:“home1”, “儿童”:[] }, { “名称”:“特定于业务和角色”, “标题”:“特定于业务和角色”, “id”:“BAR1”, “儿童”:[{ “名称”:“全球业务”, “标题

我有下面的JavaScript和n个级别的子项,我想搜索id,如果其中的任何项具有匹配的id,那么需要将对象从根返回到匹配的项

我想返回找到的项的整个层次结构,从根到对象及其子对象

我尝试使用lodash和下划线,但找不到简单的解决方案

输入:{
“儿童”:[{
“姓名”:“家”,
“头衔”:“家”,
“id”:“home1”,
“儿童”:[]
},
{
“名称”:“特定于业务和角色”,
“标题”:“特定于业务和角色”,
“id”:“BAR1”,
“儿童”:[{
“名称”:“全球业务”,
“标题”:“全球商业”,
“id”:“GB1”,
“儿童”:[{
“名称”:“商业银行”,
“标题”:“商业银行”,
“id”:“CB1”,
“儿童”:[{
“名称”:“旗舰计划”,
“标题”:“旗舰计划”,
“id”:“FG1”,
“儿童”:[]
}]
}]
}]
},
{
“名称”:“风险管理”,
“标题”:“风险管理”,
“id”:“RM1”,
“儿童”:[]
}
]
}
搜索:{
id:'FG1'
}
返回:{
“名称”:“特定于业务和角色”,
“标题”:“特定于业务和角色”,
“id”:“BAR1”,
“儿童”:[{
“名称”:“全球业务”,
“标题”:“全球商业”,
“id”:“GB1”,
“儿童”:[{
“名称”:“商业银行”,
“标题”:“商业银行”,
“id”:“CB1”,
“儿童”:[{
“名称”:“旗舰计划”,
“标题”:“旗舰计划”,
“id”:“FG1”,
“儿童”:[{}]
}]
}]
}]
}

一种方法是首先循环根子级,然后创建另一个函数以查看Id是否存在于它的任何子级中

var数据={
“儿童”:[{
“姓名”:“家”,
“头衔”:“家”,
“id”:“home1”,
“儿童”:[]
},
{
“名称”:“特定于业务和角色”,
“标题”:“特定于业务和角色”,
“id”:“BAR1”,
“儿童”:[{
“名称”:“全球业务”,
“标题”:“全球商业”,
“id”:“GB1”,
“儿童”:[{
“名称”:“商业银行”,
“标题”:“商业银行”,
“id”:“CB1”,
“儿童”:[{
“名称”:“旗舰计划”,
“标题”:“旗舰计划”,
“id”:“FG1”,
“儿童”:[]
}]
}]
}]
},
{
“名称”:“风险管理”,
“标题”:“风险管理”,
“id”:“RM1”,
“儿童”:[]
}
]
};
函数hasId(id,data){
if(data.id==id)返回true;
if(数据子项){
for(数据的常量子项。子项){
if(hasId(id,child))返回true;
}
}
返回false;
}
功能搜索(id、数据){
for(数据的常量子项。子项){
if(hasId(id,child))返回child;
}
返回null;
}

控制台日志(搜索(“FG1”,数据))一种方法是首先循环根子级,然后创建另一个函数以查看Id是否存在于其子级中

var数据={
“儿童”:[{
“姓名”:“家”,
“头衔”:“家”,
“id”:“home1”,
“儿童”:[]
},
{
“名称”:“特定于业务和角色”,
“标题”:“特定于业务和角色”,
“id”:“BAR1”,
“儿童”:[{
“名称”:“全球业务”,
“标题”:“全球商业”,
“id”:“GB1”,
“儿童”:[{
“名称”:“商业银行”,
“标题”:“商业银行”,
“id”:“CB1”,
“儿童”:[{
“名称”:“旗舰计划”,
“标题”:“旗舰计划”,
“id”:“FG1”,
“儿童”:[]
}]
}]
}]
},
{
“名称”:“风险管理”,
“标题”:“风险管理”,
“id”:“RM1”,
“儿童”:[]
}
]
};
函数hasId(id,data){
if(data.id==id)返回true;
if(数据子项){
for(数据的常量子项。子项){
if(hasId(id,child))返回true;
}
}
返回false;
}
功能搜索(id、数据){
for(数据的常量子项。子项){
if(hasId(id,child))返回child;
}
返回null;
}

控制台日志(搜索(“FG1”,数据))您可以使用此功能:

函数findChild(对象,条件){
if(Object.entries(condition).every([k,v])=>obj[k]==v)){
返回obj;
}
for(对象的const child.children | |[])){
const found=findChild(子项,条件);
//如果找到,则将此节点添加到结果的祖先
if(found)返回Object.assign({},obj,{children:[found]});
}
}
//样本数据
var input={“children”:[{“name”:“Home”、“title”:“Home”、“id”:“home1”、“children”:[]},{“name”:“BUSINESS AND ROLE SPECIFIC”、“title”:“BUSINESS AND ROLE SPECIFIC”、“id”:“BAR1”、“children”:[{“name”:“Commercial Banking”,“title”:“Commercial Banking”,“id”:“CB1”,“儿童”:[{“名称”:“旗舰计划”,“标题”:“旗舰计划”,“id”:“FG1”,“儿童”:[]}]}]}]},{“名称”:“风险管理”,“标题”:“风险管理”,“id”:“RM1”,“儿童”:[]}]},
搜索={id:'FG1'};
log(findChild(输入,搜索))

。作为控制台包装{max height:100%!important;top:0;}
您可以使用以下函数:

函数findChild(对象,条件){
if(Object.entries(condition).every([k,v])=>obj[k]==v)){
返回obj;
}
for(对象的const child.children | |[])){
const found=findChild(子项,条件);
//如果找到,则将此节点添加到结果的祖先
if(found)返回Object.assign({},obj,{children:[found]});
}
}
//样本数据
变量输入={“chil”
function getBranch(branches, leaf_id)
{   
    var result_branch = null;

    branches.some(function(branch, idx) {
        if (branch.id == leaf_id) {
            result_branch = Object.assign({}, branch);
            result_branch.children.forEach(function(child, idx) {
                delete result_branch.children[idx].children;
            });

            return true;
        } else {
            let target_branch = getBranch(branch.children, leaf_id);

            if (target_branch) {
                result_branch = Object.assign({}, branch);
                delete result_branch.children
                result_branch.children = [target_branch];

                return true;    
            }
        }

        return false;
    });

    return result_branch;
}

console.log(getBranch(input.children, 'GB1'));