0

Is it possible to use the find() method within an array of depth x?

For example, suppose I have the following array of objects, call it 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",
                    },
                ],
            }
        ]
    }
]

Suppose I am looking for the "2" id. I can use the find() method to search the first level of the array and return the desired object by doing test.find(element => element.id === "2").

However, suppose I am now looking for the occurrence where the id is 4. As you can see from the above JSON, that element is within a sub array within test. Is there a way therefore where I can still search through test to find the element where id=4?

Adam
  • 2,384
  • 7
  • 29
  • 66
  • Does this answer your question? [How to find the key of a value in a nested object recursively](https://stackoverflow.com/questions/57676477/how-to-find-the-key-of-a-value-in-a-nested-object-recursively) – kmoser May 11 '22 at 17:15
  • Not quite because what you've linked is a search through an object that can contain nested objects (the `find()` method does not work on objects). My use case is where an array can contain nested arrays of depth x. – Adam May 11 '22 at 17:19
  • Not possible with find, you need recursion. – epascarello May 11 '22 at 17:28
  • @Adam How about [Find nested objects that contain a value](https://stackoverflow.com/questions/53696986/find-nested-object-that-contains-a-value)? – kmoser May 11 '22 at 18:47

1 Answers1

4

find cannot do this, but you can use it in a recursive approach:

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);
trincot
  • 317,000
  • 35
  • 244
  • 286