Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

149
Vistas
¿Cómo puedo numerar mis puntos y subpuntos que tienen una cantidad ilimitada de objetos anidados usando la función recursiva y js?

digamos que tengo datos algo como esto

 let data = [ { subPoint:[ { point:'point a 1.1', }, { point:'point a 1.2', }, { subPoint:[ { subPoint:[ { point:'point a 1.3.1.1' } ] }, { point:'point a 1.3.1.2' } ] }, ] }, { point:'point b 1' }, { point:'point c 1' }, { subPoint:[ { subPoint:[ { point:'point d 1.1.1' } ] } ] } ]

Mi resultado previsto debería ser algo como esto

 [ '1.1.1---point a 1.1', '1.1.2---point a 1.2', '1.1.3.1.1---point a 1.3.1.1', '1.1.3.1.2---point a 1.3.1.2', '2.1---point b 1', '3.1---point c 1', '4.1.1.1---point d 1.1.1' ]

Pero lo que obtengo es esto

 [ '1.3.1---point a 1.1', '1.3.2---point a 1.2', '1.3.3.1.1.1---point a 1.3.1.1', '1.3.3.1.2---point a 1.3.1.2', '2---point b 1', '3---point c 1', '4.1.1.1---point d 1.1.1' ]

mi código se ve así

 const getInfo = (starIndex,array) => { let rowId = starIndex array.forEach((val,ind) => { if(val.subPoint){ console.log(starIndex) rowId = starIndex+'.'+(ind+1) return getInfo(rowId,val.subPoint) } }) console.log('rowId',rowId) return rowId } let returnData = [] const getData = (_data,val) => { _data.forEach((_dat,index) => { let value = (val?`${val}.`:'')+`${index+1}` if(_dat.subPoint){ value = getInfo(value,_dat.subPoint) getData(_dat.subPoint,value) }else { returnData.push(value+ '---' + _dat.point) } }) return returnData } console.log(getData(data))

Creo que me falta algo o mi recursividad es mala. No estoy seguro de cuál es el problema.

Este es un código metafórico para un problema que tengo, el problema real tiene que ver con dar una identificación única para cada componente de la fila de la tabla que puede tener cualquier número de agrupaciones.

about 4 years ago · Juan Pablo Isaza
3 Respuestas
Responde la pregunta

0

Sin niveles extra.

 const getFlat = (parent = '') => ({ point, subPoint = [] }, i) => { const p = parent + (parent && '.') + (i + 1), children = subPoint.flatMap(getFlat(p)); if (point) children.unshift([p, point].join('---')); return children; }, data = [{ subPoint: [{ point: 'point a 1.1' }, { point: 'point a 1.2' }, { subPoint: [{ subPoint: [{ point: 'point a 1.3.1.1' }] }, { point: 'point a 1.3.1.2' }] }] }, { point: 'point b 1' }, { point: 'point c 1' }, { subPoint: [{ subPoint: [{ point: 'point d 1.1.1' }] }] }], result = data.flatMap(getFlat()); console.log(result);
 .as-console-wrapper { max-height: 100% !important; top: 0; }

about 4 years ago · Juan Pablo Isaza Denunciar

0

 const data = [ { subPoint: [ { point: 'point a 1.1', }, { point: 'point a 1.2', }, { subPoint: [ { subPoint: [ { point: 'point a 1.3.1.1', }, ], }, { point: 'point a 1.3.1.2', }, ], }, ], }, { point: 'point b 1', }, { point: 'point c 1', }, { subPoint: [ { subPoint: [ { point: 'point d 1.1.1', }, ], }, ], }, ]; const flatten = (data) => { let result = []; const recurse = (data, path = '') => { for (let i = 0; i < data.length; i++) { let item = data[i]; let newPath = path ? `${path}.${i + 1}` : `${i + 1}`; if (item.point) { result.push(`${newPath}---${item.point}`); } else { recurse(item.subPoint, newPath); } } }; recurse(data); return result; } console.log(flatten(data));

about 4 years ago · Juan Pablo Isaza Denunciar

0

Este resultado no coincide con su solicitud, pero me parece mucho más lógico:

 [ "1.1---point a 1.1", "1.2---point a 1.2", "1.3.1.1---point a 1.3.1.1", "1.3.2---point a 1.3.1.2", "2---point b 1", "3---point c 1", "4.1.1---point d 1.1.1" ]

Si eso funciona para usted, aquí hay una recursividad simple que lo generará:

 const outline = (xs, path = []) => xs .flatMap (({point, subPoint = []}, i) => point ? [`${path .concat (i + 1) .join ('.')}---${point}`] : outline (subPoint, path .concat (i + 1)) ) const data = [{subPoint: [{point: "point a 1.1"}, {point: "point a 1.2"}, {subPoint: [{subPoint: [{point: "point a 1.3.1.1"}]}, {point: "point a 1.3.1.2"}]}]}, {point: "point b 1"}, {point: "point c 1"}, {subPoint: [{subPoint: [{point: "point d 1.1.1"}]}]}] console .log (outline (data))
 .as-console-wrapper {max-height: 100% !important; top: 0}

Hacemos un seguimiento de una ruta de ejecución, que puede contener valores como [2] o [1, 3, 1, 1] , y en cada llamada, si llegamos a un nodo con una propiedad de point , combinamos la ruta con esa cadena de propiedad . Si no lo hemos hecho, agregamos el índice actual (más uno para lidiar con el conteo basado en cero de JS) a la ruta y recurrimos a los elementos secundarios del nodo subPoint .

Si esa salida no funciona, ¿puede explicar exactamente de dónde proviene cada uno de los prefijos de esquema de destino?

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda