¿Cómo busco recursivamente un árbol de objetos y devuelvo el objeto coincidente basado en una clave / valor usando JavaScript / Prototype 1.7

Tengo algunos datos de objetos anidados y quiero buscarlos y devolver el objeto coincidente basado en la identificación.

var data = [{id: 0, name: 'Template 0', subComponents:[
        {id: 1, name: 'Template 1', subItems:[
            {id: 2, name: 'Template 2', subComponents:[{id: 3, name: 'Template 3'}], subItems: [{id: 4, name: 'Template 4'}]}
        ]}
    ]}
];

Así que quiero hacer algo como esto

getObjectByKeyValue({id: 3}) 

y que regrese

{id: 3, name: 'Template 3'}

Tiene que hacerse de forma genérica porque tengo subItems y subcomponentes que podrían tener hijos.

Intenté esto usando Prototype 1.7 y no tuve suerte. Creo que esto solo busca una matriz, y no un árbol con sus subnodos:

data.find(function(s){return s.id == 4;})

¡¡¡¡¡¡Gracias por adelantado!!!!!

Respuestas a la pregunta(4)

Su respuesta a la pregunta