Tengo una matriz de objetos y necesito convertirla en una matriz de matrices agrupadas según la posición, pero manteniendo el orden de los elementos.
Esto es lo que hice:
const data = [{ position: 'left', message: 'a' }, { position: 'left', message: 'b' }, { position: 'left', message: 'c' }, { position: 'right', message: 'd' }, { position: 'right', message: 'e' }, { position: 'left', message: 'f' }, { position: 'left', message: 'g' }] console.log(data.reduce((a, c) => { let b = []; let d = []; if (c.position === 'left') { b.push(c.message) } if (c.position === 'right') { d.push(c.message) } a.push(b) return a }, []))Rendimiento esperado:
[['a', 'b', 'c'], ['d', 'e'], ['f', 'g']]Los mismos elementos de posición se agrupan en una matriz y si la siguiente posición es diferente, se agrupa en una matriz diferente y continúa. Por ejemplo, 'a' 'b' 'c' se colocan a la izquierda y se agrupan dentro de una matriz, 'd' 'e' se colocan a la derecha, se agrupan como la segunda matriz y 'f' 'g' se dejan posicionados, se agrupan como una tercera matriz.
Gracias.
Codificar la creación de dos matrices no será suficiente, especialmente dentro de la devolución de llamada .reduce . Si necesita usar .reduce aquí (que no recomendaría porque parece un poco complicado), use el índice de iteración para verificar el último índice y ver qué position se usó allí. Si es diferente de la posición del índice actual, inserte una nueva matriz en el acumulador. Finalmente, empuje incondicionalmente el mensaje actual a la última matriz en el acumulador.
const data = [{ position: 'left', message: 'a' }, { position: 'left', message: 'b' }, { position: 'left', message: 'c' }, { position: 'right', message: 'd' }, { position: 'right', message: 'e' }, { position: 'left', message: 'f' }, { position: 'left', message: 'g' }] console.log(data.reduce((a, { position, message }, i, arr) => { const lastPosition = arr[i - 1]?.position; if (lastPosition !== position) a.push([]); a[a.length - 1].push(message); return a }, [])) Sin .reduce , y probablemente más legible:
const data = [{ position: 'left', message: 'a' }, { position: 'left', message: 'b' }, { position: 'left', message: 'c' }, { position: 'right', message: 'd' }, { position: 'right', message: 'e' }, { position: 'left', message: 'f' }, { position: 'left', message: 'g' }]; let lastPosition; const result = []; for (const { position, message } of data) { if (position !== lastPosition) result.push([]); result[result.length - 1].push(message); lastPosition = position; } console.log(result);Puede agrupar mirando el objeto anterior.
const data = [{ position: 'left', message: 'a' }, { position: 'left', message: 'b' }, { position: 'left', message: 'c' }, { position: 'right', message: 'd' }, { position: 'right', message: 'e' }, { position: 'left', message: 'f' }, { position: 'left', message: 'g' }], result = data.reduce((r, o, i, a) => { if (o.position !== a[i - 1]?.position) r.push([]); r[r.length - 1].push(o); return r; }, []); console.log(result); .as-console-wrapper { max-height: 100% !important; top: 0; }