Agradecería si alguien pudiera ayudarme a despegarme. Tengo una matriz que me gustaría describir usando un objeto. La matriz se ve así:
const numberGroupArray = [ 'GROUP_A', 'ONE', 'TWO', 'BREAK', 'FOUR', 'GROUP_B', 'SIX', 'GROUP_C', 'EIGHT', 'BREAK', 'TEN', 'ELEVEN', 'GROUP_D', 'THIRTEEN', 'BREAK', 'FIFTEEN', 'BREAK', 'SEVENTEEN', 'EIGHTEEN', 'NINETEEN', ]Y el objeto objetivo se ve así:
const numberInGroup = { GROUP_A: [[1, 2], [4]], GROUP_B: [[6]], GROUP_C: [[8], [10, 11]], GROUP_D: [[13], [15], [17, 18, 19]], }; Donde cada número se refiere a un índice de la matriz anterior. numberInGroup.GROUP_A[0][1] se refiere a 'DOS' en la matriz anterior. De manera similar, numberInGroup.GROUP_D[2][1] se refiere a 'DIECISIETE'.
Intentando trabajar a través de la creación del objeto:
Si necesita más información, feliz de proporcionar. Gracias de antemano.
Reduciría la matriz manteniendo un cierre sobre el último grupo.
const data = ['GROUP_A', 'ONE', 'TWO', 'BREAK', 'FOUR', 'GROUP_B', 'SIX', 'GROUP_C', 'EIGHT', 'BREAK', 'TEN', 'ELEVEN', 'GROUP_D', 'THIRTEEN', 'BREAK', 'FIFTEEN', 'BREAK', 'SEVENTEEN', 'EIGHTEEN', 'NINETEEN'], result = data.reduce((group => (r, v) => { if (v.startsWith('GROUP_')) { group = r[v] = [[]]; return r; } if (v === 'BREAK') { group.push([]); return r; } group[group.length - 1].push(v); return r; })(), {}); console.log(result); .as-console-wrapper { max-height: 100% !important; top: 0; }Simplemente recorra la matriz y genere el resultado a medida que avanza.
Básicamente, si ve GROUP_A (o lo que sea), crea una nueva propiedad en su resultado, con una matriz en blanco. Realice un seguimiento del grupo actual y en qué matriz está ingresando.
Luego, cuando presione BREAK , agregue una nueva matriz y cambie el contador.
Para los valores, use sus contadores y coloque el valor en el lugar correcto.
const numberGroupArray = [ 'GROUP_A', 'ONE', 'TWO', 'BREAK', 'FOUR', 'GROUP_B', 'SIX', 'GROUP_C', 'EIGHT', 'BREAK', 'TEN', 'ELEVEN', 'GROUP_D', 'THIRTEEN', 'BREAK', 'FIFTEEN', 'BREAK', 'SEVENTEEN', 'EIGHTEEN', 'NINETEEN', ]; let numberInGroup = {}, // The result object currGroup, // Which group/property are we inside? currIdx, // Which sub-array are we pushing to? isGroup; // Do we need to change to a new group? numberGroupArray.forEach(val => { // Is this a new group? // If so, then make a new property and reset the counters if ((isGroup = val.match(/GROUP_[AZ]/))) { currGroup = isGroup[0]; currIdx = 0; numberInGroup[currGroup] = [[]]; } // BREAK means to push a new array into the current group else if (val === 'BREAK') { currIdx++; numberInGroup[currGroup].push([]); } // Otherwise push the value into the right spot in the final result else { numberInGroup[currGroup][currIdx].push(val); } }); console.log(numberInGroup);