Javascript 在具有完整路径的树中查找匹配节点

Javascript 在具有完整路径的树中查找匹配节点,javascript,typescript,Javascript,Typescript,我有一个像这样的对象数组 [{ name: "Peter", children: [{ name: "John", children: [{ name: "Joseph", children: [] }] }, { name: "Shawn", children: [{ name: "Joseph",

我有一个像这样的对象数组

[{
    name: "Peter",
    children: [{
        name: "John",
        children: [{
            name: "Joseph",
            children: []
        }]
    }, {
        name: "Shawn",
        children: [{
            name: "Joseph",
            children: []
        }]
    }]
}, {
    name: "Carl",
    children: [{
        name: "Sam",
        children: [{
            name: "JohnXX",
            children: []
        }]
    }]
}]
[{
    name: "Peter",
    children: [{
        name: "John",
        children: [{
            name: "Joseph",
            children: []
        }]
    }]
}, {
    name: "Carl",
    children: [{
        name: "Sam",
        children: [{
            name: "JohnXX",
            children: []
        }]
    }]
}]
每个人可以有多个孩子,每个孩子可以有任意数量的孩子,以此类推

我希望保留包含匹配子项的完整路径,并排除不匹配子项

[{
    name: "Peter",
    children: [{
        name: "John",
        children: [{
            name: "Joseph",
            children: []
        }]
    }, {
        name: "Shawn",
        children: [{
            name: "Joseph",
            children: []
        }]
    }]
}, {
    name: "Carl",
    children: [{
        name: "Sam",
        children: [{
            name: "JohnXX",
            children: []
        }]
    }]
}]
[{
    name: "Peter",
    children: [{
        name: "John",
        children: [{
            name: "Joseph",
            children: []
        }]
    }]
}, {
    name: "Carl",
    children: [{
        name: "Sam",
        children: [{
            name: "JohnXX",
            children: []
        }]
    }]
}]

您需要生成一个只包含相关部分的新对象

该建议适用于单级迭代,适用于子级递归

函数getNodes(数组,cb){ 返回数组.reduce(函数iter(r,a){ 儿童; 如果(cb(a)){ 返回r.concat(a); } if(Array.isArray(a.children)){ children=a.children.reduce(iter,[]); } if(儿童长度){ 返回r.concat({name:a.name,children:children}); } 返回r; }, []); } var数据=[{name:“Peter”,children:[{name:“John”,children:[[]}],{name:“Joseph”,children:[]}]},{name:“Joseph”,children:[{name:“Sam”,children:[{name:“JohnXX”,children:[]}]}]}],{name:“Carl”,children:[{name:“Sam”,children:[{name:“Sam”,children; log(getNodes(数据,函数(o){returno.name.indexOf('John')!==-1;}))
.as控制台包装{max height:100%!important;top:0;}
此代码返回整个树,而不是删除不匹配的子项。请将代码放入问题中。