En un árbol de múltiples nodos , cuando agrego una nueva fila, necesito obtener la referencia de esa fila, por su id, para activar el evento de clic de fila mediante programación.
En el siguiente ejemplo, si agrego la fila con id 9, cómo iterar a través del árbol hasta este nodo.
Nota: los hijos de los nodos hijos son ilimitados (por ejemplo: padre-hijos-hijos-hijos-hijos-hijos... )
Ejemplo de árbol
let data = [{ "id": 1, "name": "parent 1" }, { "id": 2, "name": " parent 2", "children": [{ "id": 5, "name": "parent-children 5", },{ "id": 6, "name": "parent-children 6", "children": [{ "id": 7, "name": "parent-children-children 7", },{ "id": 8, "name": "parent-children-children 8", "children": [{ "id": 9, "name": "parent-children-children-children 9", },{ "id": 10, "name": "parent-children-children-children 10", }] }] }] }, { "id": 3, "name": "parent 3" }, { "id": 4, "name": "parent 4" }]Iteración en los niveles uno y dos de los nodos
getItemRow(id){ //If is a parent node let myItem = this.parents.find(parent => parent.id === id); if(myItem !== undefined){ return myItem } //If is a second level children node (parent-children) this.parents.forEach(function(parent){ let child = parent.children.find(child => child.id === id); if(child !== undefined){ return child } }); }Podemos buscar recursivamente todos los nodos hasta encontrar la coincidencia:
getItemRow(id){ return findNodeWithId(id, this.parents) } findNodeWithId(id, rootArr) { for (let el of rootArr) { if (el.id === id) { return el } if (el.children) { const idFoundInChildren = findNodeWithId(id, el.children) if (idFoundInChildren !== null) { return idFoundInChildren } } } return null }Puede tomar una recursividad y encontrar el objeto directamente o buscando en la matriz de niños.
const find = (array, id) => { let result; array.some(o => result = o.id === id ? o : find(o.children || [], id) ) return result; }, data = [{ id: 1, name: "parent 1" }, { id: 2, name: " parent 2", children: [{ id: 5, name: "parent-children 5" }, { id: 6, name: "parent-children 6", children: [{ id: 7, name: "parent-children-children 7" }, { id: 8, name: "parent-children-children 8", children: [{ id: 9, name: "parent-children-children-children 9" }, { id: 10, name: "parent-children-children-children 10" }] }] }] }, { id: 3, name: "parent 3" }, { id: 4, name: "parent 4" }]; console.log(find(data, 9));