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.
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; } 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));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?