如何使用 Lodash/JS 递归过滤嵌套对象?

pix*_*sic 2 javascript recursion filter multidimensional-array lodash

我有一个包含深度未知的对象的数组,如下所示

var objects = [{
    id: 1,
    name: 'foo'
}, {
    id: 2,
    name: 'bar',
    childs: [{
        id: 3,
        name: 'baz',
        childs: [{
            id: 4,
            name: 'foobar'
        }]
    }]
}];
Run Code Online (Sandbox Code Playgroud)

我希望能够通过 id 过滤特定的子对象。

目前我正在使用这个小 lodash 脚本(从这个问题引用),但它仅适用于深度不超过一层的对象。因此,搜索id: 1andid: 2会很好地工作,而搜索id: 3orid: 4会返回 undefined。

function deepFilter(obj, search) {
    return _(obj)
        .thru(function(coll) {
            return _.union(coll, _.map(coll, 'children'));
        })
        .flatten()
        .find(search);
}
Run Code Online (Sandbox Code Playgroud)

一点 JSfiddle。

Nin*_*olz 6

您可以采用迭代和递归方法。

function find(id, array) {
    var result;
    array.some(o => o.id === id && (result = o) || (result = find(id, o.children || [])));
    return result;
}

var objects = [{ id: 1, name: 'foo' }, { id: 2, name: 'bar', children: [{ id: 3, name: 'baz', children: [{ id: 4, name: 'foobar' }] }] }];

console.log(find(1, objects));
console.log(find(2, objects));
console.log(find(3, objects));
console.log(find(4, objects));
Run Code Online (Sandbox Code Playgroud)
.as-console-wrapper { max-height: 100% !important; top: 0; }
Run Code Online (Sandbox Code Playgroud)