Estoy tratando de eliminar los últimos elementos de una matriz siempre que la suma de la matriz sea superior a un límite. El código que tengo funciona, pero parece causar ralentizaciones o bloqueos. Me preguntaba si hay una solución más elegante.
let array = [166, 157, 251, 171, 191]; let limit = 400; for ( let sum = array.reduce((a, b) => a + b); sum > limit; sum = array.reduce((a, b) => a + b) ) { array.pop(); } console.log(array);No necesita sumar la matriz completa cada vez que pasa por el bucle. Calcular la suma una vez al principio. Luego resta el elemento que eliminaste de la suma.
let array = [166, 157, 251, 171, 191]; let limit = 400; for (let sum = array.reduce((a, b) => a + b); sum > limit; sum -= array.pop()) {} console.log(array);Esta solución logrará el resultado en
O(n)
Puede lograr el resultado si recorre la array y recuerda el último total, es decir, currentTotal y detiene la break y sale del ciclo si
currentTotal + val > limit de lo contrario, agregue el valor actual en currentTotal y empuje ese elemento en la matriz de result .
let array = [166, 157, 251, 171, 191]; let limit = 400; let currentTotal = 0; const result = []; for (let val of array) { if (currentTotal + val > limit) { break; } result.push(val); currentTotal += val; } console.log(result);Para mejorar la eficiencia, como dijo Barmar , puede calcular la suma una vez y actualizarla en cada iteración del bucle. Creo que un ciclo while expresa esta idea de la manera más clara:
const arr = [166, 157, 251, 171, 191]; const limit = 400; let sum = arr.reduce((a, b) => a + b) while (sum > limit) { const lastNum = arr.pop(); sum -= lastNum; } console.log(arr)