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 = 140
Solució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.max
range.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)