Tengo una lista de edades y grupos de edades.
Quiero tomar cada elemento de la lista de edades y buscar en la lista ageGroup el intervalo donde se recupera el precio, si un elemento está en dos intervalos para recuperar el precio más bajo de la lista, quiero la suma de los precios totales .
Por ejemplo :
para los 8 años tengo precio =50 y para 20 y 67 tengo dos opciones 90 y 70, elegiré el precio más bajo que es 70 y luego el resultado debe ser 70 + 70 + 50 = 190 precio = 190
let ages = [8, 20, 67] let agesGroups = [{ min: 10, max: 90, price: 90 }, { min: 10, max: 90, price: 70 }, { min: 0, max: 10, price: 50 } ] let price = 0 ages.forEach(a => { agesGroups.forEach(s => { if (a >= s.min && a <= s.max) { price = price + parseInt(s.price, 10); } }) }) console.log(price);El resultado que obtuve
price = 140Solución, por sugerencia de @Barmar, usando reduce(). "resultado" ahora contiene precios mínimos para todas las edades. Puede resumirlos si es necesario:
let result = [] ages.forEach(a => { result.push(agesGroups.reduce((res, s) => { if(a >= s.min && a <= s.max) { if (s.price < res) { res = s.price} } return res }, Infinity)); }); console.log(result)A veces, el uso de métodos Array es demasiado restrictivo para lo que se devuelve y es difícil de navegar. Un bucle for...of es más fácil de leer y refactorizar con métodos Array más adelante.
Defina la matriz de prices para mantener cada mejor precio
Exterior for...of bucle para iterar la matriz de ages
Defina la matriz inRange para mantener cada precio dentro de un range
Interno for...of bucle para iterar matriz de ranges
age está dentro del rango de range.min y range.maxrange.price en la matriz inRange si la age está dentro del rango Inserte el rango más range.price de inRange en la matriz de prices
prices.push( Math.min(...inRange)); Luego agregue todos los precios de la matriz de price
prices.reduce((sum, add) => sum + add) let ages=[8,20,67],ranges=[{min:10,max:90,price:90},{min:10,max:90,price:70},{min:0,max:10,price:50}]; let prices = []; for (let age of ages) { let inRange = []; for (let range of ranges) { if (age >= range.min && age <= range.max) { inRange.push(range.price); } } prices.push( Math.min(...inRange)); } let total = prices.reduce((sum, add) => sum + add); console.log(total);Refactorizado
let ages=[8,20,67],ranges=[{min:10,max:90,price:90},{min:10,max:90,price:70},{min:0,max:10,price:50}]; let total = ages.map(age => { let prices = ranges.flatMap(rng => rng.min <= age && rng.max >= age ? [rng.price] : []); return Math.min(...prices); }).reduce((sum, add) => sum + add); console.log(total)