Tengo una matriz de matrices de diferentes tamaños. El objetivo es generar "filas" donde cada fila puede contener un máximo de 12 elementos. Por ejemplo:
Los datos de entrada pueden ser algo como esto: const groups = [[1,2,3,4],[1,2,3,4,5,6], [1,2,3,4,5,6,7,8,9,10,11,12], [1,2,3,4,5,6,7], [1,2,3],[1,2,3]]
groups[0].length + groups[1].length = 10 -> row0 groups[2].length = 12 -> row1 groups[3].length + groups[4].length = 10 -> row3 groups[5].length = 3 -> row4La salida para dicha matriz debe ser:
[[[1,2,3,4], [1,2,3,4,5,6]], [[1,2,3,4,5,6,7,8,9,10,11,12]], [[1,2,3,4,5,6,7], [1,2,3]], [[1,2,3]]]Estaba pensando en una función recursiva para esto, pero no pude encontrar la manera de resolverlo.
Puede usar Array#reduce() para hacer esto. El código primero verifica si el último elemento actual (última "fila") tiene más de 12 números si agrega el siguiente grupo:
(acc[acc.length - 1].flat().length + cv.length) <= 12si será menor de 12, los elementos se colocarán en la "fila":
acc[acc.length - 1].push(cv)y si no, se agregará una nueva "fila" a la matriz externa:
acc.push([cv]) const groups = [[1, 2, 3, 4],[1, 2, 3, 4, 5, 6],[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],[1, 2, 3, 4, 5, 6, 7],[1, 2, 3],[1, 2, 3]]; const rows = groups.reduce((acc, cv) => { (acc[acc.length - 1].flat().length + cv.length) <= 12 ? acc[acc.length - 1].push(cv) : acc.push([cv]) return acc }, [[]]); console.log(JSON.stringify(rows))Aquí hay una forma de resolverlo recursivamente:
const regroup = (max, [g, ...gs], filled = [], curr = [], cc = 0) => g == undefined ? filled .concat ([curr]) : g .length + cc <= max ? regroup (max, gs, filled, curr .concat ([g]), cc + g.length) : regroup (max, gs, filled .concat ([curr]), [g], g .length) const groups = [[1, 2, 3, 4], [1, 2, 3, 4, 5, 6], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], [1, 2, 3, 4, 5, 6, 7], [1, 2, 3], [1, 2, 3]] console .log (regroup (12, groups)) .as-console-wrapper {max-height: 100% !important; top: 0}Pasamos el tamaño máximo y la lista de elementos, y luego por defecto tres parámetros:
filled rastreará las filas de salida que hemos llenado; comienza con una matriz vacíacurr almacena la fila en la que estamos trabajando; también comienza con una matriz vacíacc almacena el recuento de todos los elementos en la fila actual; comienza con ceroEn cada llamada recursiva, tenemos una de tres posibilidades: