使用完整路径查找树中的匹配节点

时间:2016-10-17 20:54:04

标签: 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: []
        }]
    }]
}]

每个人可以有多个孩子,每个孩子都可以有多个孩子等等。

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

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

1 个答案:

答案 0 :(得分:1)

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

此提案针对单个级别进行迭代,并为子级进行递归。

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; }