在 x 深度 Javascript 的数组中查找元素

Find element in array of x depth Javascript

是否可以在深度为 x 的数组中使用 find() 方法?

例如,假设我有以下对象数组,将其命名为 test:

[
    {
        "id": "1",
        "title": "First",
    },
    {
        "id": "2",
        "title": "Second",
        "movies": [
            {
                "id": "3",
                "title": "Happy Gilmore",
                "Actors": [
                    {
                        "id": "4",
                        "title": "John Doe",
                    },
                    {
                        "id": "5",
                        "title": "Jane Doe",
                    },
                ],
                "Producers": [
                    {
                        "id": "6",
                        "title": "Max Smith",
                    },
                    {
                        "id": "7",
                        "title": "Richard Rocky",
                    },
                ],
            },
            {
                "id": "10",
                "title": "Billy Madison",
                "Actors": [
                    {
                        "id": "40",
                        "title": "John Smith",
                    },
                    {
                        "id": "50",
                        "title": "Alex Doe",
                    },
                ],
                "Producers": [
                    {
                        "id": "60",
                        "title": "Bob Smith",
                    },
                    {
                        "id": "70",
                        "title": "Polly Rocky",
                    },
                ],
            }
        ]
    }
]

假设我正在寻找“2”id。我可以使用 find() 方法搜索数组的第一级,并通过执行 test.find(element => element.id === "2").

return 所需的对象

但是,假设我现在正在寻找 id 为 4 的事件。正如您从上面 JSON 中看到的那样,该元素位于 test 的子数组中。因此,有没有办法让我仍然可以搜索 test 以找到 id=4 的元素?

find 无法做到这一点,但您可以在递归方法中使用它:

function findDeep(arr, predicate) {
    let res = arr.find(predicate);
    if (res !== undefined) return res;
    for (let obj of arr) {
        for (let value of Object.values(Object(obj)).filter(Array.isArray)) {
            res = findDeep(value, predicate);
            if (res !== undefined) return res;
        }
    }
}

let test = [{"id": "1","title": "First",},{"id": "2","title": "Second","movies": [{"id": "3","title": "Happy Gilmore","Actors": [{"id": "4","title": "John Doe",},{"id": "5","title": "Jane Doe",},],"Producers": [{"id": "6","title": "Max Smith",},{"id": "7","title": "Richard Rocky",},],},{"id": "10","title": "Billy Madison","Actors": [{"id": "40","title": "John Smith",},{"id": "50","title": "Alex Doe",},],"Producers": [{"id": "60","title": "Bob Smith",},{"id": "70","title": "Polly Rocky",},],}]}];

let res = findDeep(test, obj => obj.id == "4");

console.log(res);