Estoy tratando de encontrar un elemento en una matriz multidimensional usando la función JAVASCRIPT, pero recibo un error
Estos son los datos de mi matriz:
export const datas = [ { id: 1, firstName: 'John', tables: [ { ID: 11, title: 'Lorem' }, { ID: 12, title: 'Ipsum' }, ], }, { id: 2, firstName: 'Doe', tables: [ { ID: 22, title: 'Arke', nodes: [{ name: 'Name1' }, { name: 'Name2' }, { name: 'Name3' }], }, { ID: 23, title: 'Korem' }, ], }, { id: 3, firstName: 'Brad', tables: [ { ID: 30, title: 'Mern', nodes: [{ name: 'Name4' }, { name: 'Name5' }, { name: 'Name6' }], }, { ID: 31, title: 'Full', nodes: [{ name: 'Name7' }, { name: 'Name8' }, { name: 'Name9' }], }, ], }, ];Probé una función recursiva pero no funciona, este es mi código:
export const findById = (arr, id) => { for (let o of arr) { if (o.tables.length > 0) { let a = findById(o.tables.nodes, 'id'); console.log(a); } } };Quiero imprimir el Objeto con ID 22, el problema es que no tengo la misma estructura en cada dimensión, y todavía me confunde.
Mi entrada: 22
Mi salida:
{ ID: 22, title: 'Arke', nodes: [{ name: 'Name1' }, { name: 'Name2' }, { name: 'Name3' }], },¿Tiene alguna idea de cómo editar mi función para obtener la respuesta de mi entrada?
Su función recursiva no estaba demasiado lejos, primero debe verificar si el elemento es una tabla antes de volver a llamarlo recursivamente. Y luego, finalmente, simplemente verifique la ID en el bucle.
p.ej..
const datas=[{id:1,firstName:"John",tables:[{ID:11,title:"Lorem"},{ID:12,title:"Ipsum"}]},{id:2,firstName:"Doe",tables:[{ID:22,title:"Arke",nodes:[{name:"Name1"},{name:"Name2"},{name:"Name3"}]},{ID:23,title:"Korem"}]},{id:3,firstName:"Brad",tables:[{ID:30,title:"Mern",nodes:[{name:"Name4"},{name:"Name5"},{name:"Name6"}]},{ID:31,title:"Full",nodes:[{name:"Name7"},{name:"Name8"},{name:"Name9"}]}]}]; function findById(arr, ID) { for (const a of arr) { if (a.tables) { const r = findById(a.tables, ID); if (r) return r; } if (a.ID === ID) return a; } } console.log(findById(datas, 22));si solo necesita los datos anidados, puede usar flatMap y encontrar
const findById = (arr, id) => arr .flatMap(d => d.tables) .find(t => t.ID === id) const datas = [{ id: 1, firstName: 'John', tables: [{ ID: 11, title: 'Lorem' }, { ID: 12, title: 'Ipsum' }, ], }, { id: 2, firstName: 'Doe', tables: [{ ID: 22, title: 'Arke', nodes: [{ name: 'Name1' }, { name: 'Name2' }, { name: 'Name3' }], }, { ID: 23, title: 'Korem' }, ], }, { id: 3, firstName: 'Brad', tables: [{ ID: 30, title: 'Mern', nodes: [{ name: 'Name4' }, { name: 'Name5' }, { name: 'Name6' }], }, { ID: 31, title: 'Full', nodes: [{ name: 'Name7' }, { name: 'Name8' }, { name: 'Name9' }], }, ], }, ]; console.log(findById(datas, 22))js tiene increíbles opciones de matriz https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array
los que más te ayudarán son probablemente:
Aquí hay unos ejemplos
// get the base with id 22 const baseWith22ID = datas.filter(f => f.tables.filter(s => s.id = 22)) // (i guess you want this one) get all elements with id 22 const onlyElementsWith22ID = datas.flatMap(f => f.tables.filter(s => s.id = 22))