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

标签 javascript typescript

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

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

每个人可以有多个 child ,每个 child 可以有任意数量的 child ,依此类推。

我想保留具有匹配子项的完整路径并排除不匹配子项。例如,如果我搜索 John 输出应该是这样的

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

最佳答案

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

该提案对于单个级别进行迭代,对于子级进行递归。

function getNodes(array, cb) {
    return array.reduce(function iter(r, a) {
        var children;
        if (cb(a)) {
            return r.concat(a);
        }
        if (Array.isArray(a.children)) {
            children = a.children.reduce(iter, []);
        }
        if (children.length) {
            return r.concat({ name: a.name, children: children });
        }
        return r;
    }, []);
}

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

console.log(getNodes(data, function (o) { return o.name.indexOf('John') !== -1; }));
.as-console-wrapper { max-height: 100% !important; top: 0; }

关于javascript - 在具有完整路径的树中查找匹配节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40095483/

相关文章:

javascript - 在 jQuery 中动态创建表

javascript - typescript Await 在回调中不起作用

visual-studio-2013 - TypeScript 1.3 保护错误

angular - 如何从 Angular 6 中的另一个模块导入服务

reactjs - react typescript : FunctionComponent with templated props

typescript - 如何通过 bool 值输入保护?

c# - 如何获取上一页的值

javascript - 这个脚本标签在 Firefox 中工作正常,但在 Chrome 中不行(因为遇到一些安全问题)

javascript - 使用 D3 制作没有 mustache 的彩色箱线图

javascript - Serverless NodeJS跳过https请求