Necesito fragmentar una serie de objetos, así que escribo:
function conditionalChunk(array, size, rules = {}) { let copy = [...array], output = [], i = 0; while (copy.length) output.push(copy.splice(0, rules[i++] ?? size)) return output }y funciona bien si tengo reglas como { 0: 2, 1: 2 }
const input = [[1,2,3],[4,5,6,7]], output = conditionalChunk(input.flat(), 3, { 0: 2, 1: 2 }); // OUTPUT: [[1,2],[3,4],[5,6,7]]pero cuando tengo reglas al final como { 0: 2, 1: 2, 2: 0, 5: 0 } mi función ignora para crear matrices vacías al final.
la salida que necesito es:
const input = [[1,2,3],[4,5,6,7]], output = conditionalChunk(input.flat(), 3, { 0: 2, 1: 2, 2:0, 5:0 }); // OUTPUT: [[1,2],[3,4],[],[5,6,7],[]]así que solo necesito no ignorar las reglas para matrices vacías al final de la matriz. ¿Como puedo hacer eso?
Finalmente, puede verificar las claves de rules y, si es mayor o igual que el siguiente índice de output insertar una matriz vacía.
function conditionalChunk(array, size, rules = {}) { let output = [], i = 0; while (i < array.length) output.push(array.slice(i, i += rules[output.length] ?? size)); let l = Object.keys(rules).reduce((l, v) => l + (v >= output.length), 0); while (l--) output.push([]); return output; } console.log(conditionalChunk([1, 2, 3, 4, 5, 6, 7], 3, { 0: 2, 1: 2 })); // [[1,2],[3,4],[5,6,7]] console.log(conditionalChunk([1, 2, 3, 4, 5, 6, 7], 3, { 0: 2, 1: 2, 2: 0, 5: 0 })); // [[1,2],[3,4],[],[5,6,7],[]] console.log(conditionalChunk([1, 2, 3, 4, 5, 6, 7], 3, { 0: 0, 1: 2, 8: 0, 7: 0, 9:0, 20:0 })); .as-console-wrapper { max-height: 100% !important; top: 0; }Una solución a su problema sería agregar este fragmento de código después del ciclo while antes de la declaración de return
output.length = Math.max.apply(null, [output.length, ...Object.keys(rules)]) || output.length; for (r in rules) { output[r] = new Array(rules[r]); }Simplemente extiende la matriz de salida a la longitud deseada y luego llena los lugares requeridos con matrices vacías (perdón por la primera línea complicada, pero JavaScript es complicado, así que: | ...)
Pruebe este, debería funcionar para usted y se realiza en función de su solución, por lo que debería ser más fácil de entender.
function conditionalChunk(array, size, rules = {}) { let copy = [...array], output = [], i = 0; while (copy.length) output.push(copy.splice(0, rules[i++] ?? size)); const arr = Object.keys(rules).filter((key) => key > i); arr.forEach((key) => { if (rules[key] === 0) output.push([]); }); return output; }