Tengo una matriz de objetos que se implementa como un árbol con la siguiente estructura. Estoy tratando de implementar una funcionalidad de búsqueda que básicamente busca la clave dentro de estos objetos y los devuelve manteniendo la relación.
const arr = [ { name: "internalcorp.com", config: { val1: false, val2: false }, children: [ { name: "internalcorp.com.child1", config: { val1: true, val2: true }, children: [ { name: "internalcorp.com.grandchild1", config: { val1: true, val2: true }, children: [] }, { name: "internalcorp.com.grandchild2", config: { val1: false, val2: true }, children: [] } ] }, { name: "internalcorp.com.child2", config: { val1: true, val2: false }, children: [] } ] }, { name: "internalcorpwebsite.com", children: [ { name: "internalcorpwebsite.com.child1", className: "level-1 leaf", children: [], val1: false, val2: false } ], config: { val1: false, val2: false } } ]; Aquí necesito buscar la matriz en función de la clave "nombre" de forma recursiva y devolver ese objeto manteniendo la relación padre-hijo. La búsqueda debe ser una búsqueda contains
Código que probé:
function result(input) { let res = arr.map((item) => { if (item.name === input) return item; }); return res; } console.log(result("website"));Algo como esto, puedes jugar con él aquí: Codepen Playground He hecho la búsqueda sin distinción entre mayúsculas y minúsculas y también puedes buscar varias palabras, debería darte un árbol completo y mantener la relación padre-hijo, pruébalo
const arr = [ { name: "internalcorp.com", config: { val1: false, val2: false }, children: [ { name: "internalcorp.com.child1", config: { val1: true, val2: true }, children: [ { name: "internalcorp.com.grandchild1", config: { val1: true, val2: true }, children: [] }, { name: "internalcorp.com.grandchild2", config: { val1: false, val2: true }, children: [] } ] }, { name: "internalcorp.com.child2", config: { val1: true, val2: false }, children: [] } ] }, { name: "internalcorpwebsite.com", children: [ { name: "internalcorpwebsite.com.child1", className: "level-1 leaf", children: [], val1: false, val2: false } ], config: { val1: false, val2: false } } ]; function result(input) { const v = input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); const regex = new RegExp(v.trim().replace(" ", "|"), "i"); return arr.filter(function f(o) { let found = false; if (regex.test(o.name)) found = true; if (o.children) { const x = o.children.filter(f); if (x.length) { o.children = x; return true; } return found; } }); } console.log(result("website.com"));