Tengo una serie de objetos (automóviles), de los cuales quiero mostrar solo los autos que "compiten".
const cars = [ { name: "red", competes: true, category: 1 }, { name: "blue", competes: false, category: 1 }, { name: "green", competes: true, category: 2 }, { name: "yellow", competes: true, category: 3 } ]Pero de los autos que compiten, solo quiero mostrar los autos que están en la categoría uno, lo cual está bien con un bucle for.
Los objetos ahora son estáticos, pero como quiero cambiarlos en un segundo momento, necesito un código que verifique si los autos compiten y luego verifique si hay autos en la "categoría" uno.
Mi intento fue con un bucle dentro de un bucle, algo que no funciona ya que muestra todo varias veces
for (let i = 0; i < cars.length; i++) { if (cars[i].competes === false) continue; for (let f = 0; f < cars.length; f++) { if (cars[f].category > 1) break; console.log(`Cat1: ${cars[f].name}`); } }¿Cómo se puede resolver esto si los atributos de "categoría" dentro de "automóviles" son, por ejemplo, 2 o más?
const cars = [ { name: "red", competes: true, category: 2 }, { name: "blue", competes: false, category: 2 }, { name: "green", competes: true, category: 3 }, { name: "yellow", competes: true, category: 4 } ]Aquí hay una solución simple con ordenar y filtrar
const cars = [ { name: "red", competes: true, category: 1 }, { name: "blue", competes: false, category: 1 }, { name: "green", competes: true, category: 2 }, { name: "yellow", competes: true, category: 3 } ] let result = cars.sort((a,b) => a.category - b.category) .filter(car => car.competes && (cars.length && car.category == cars[0].category)) console.log(result)Podemos comenzar obteniendo la 'categoría competidora' obteniendo la categoría competidora más baja presente, usando Math.min() y Array.filter()
Luego, podemos obtener todos los autos de la competencia usando Array.filter() para devolver solo autos con un valor de competes que sea verdadero y que también pertenezca a la categoría de la competencia.
const cars = [ { name: "red", competes: true, category: 1 }, { name: "blue", competes: false, category: 1 }, { name: "green", competes: true, category: 2 }, { name: "yellow", competes: true, category: 3 } ] // Only this category is competing.. const competingCategory = Math.min(...cars.filter(car => car.competes).map(({category}) => category)); const competingCars = cars.filter(car => car.competes && car.category === competingCategory); console.log('Competing cars:', competingCars) .as-console-wrapper { max-height: 100% !important; top: 0; }Este ejemplo tiene solo las categorías 2 y 3 presentes:
const cars = [ { name: "blue", competes: true, category: 2 }, { name: "green", competes: true, category: 2 }, { name: "yellow", competes: true, category: 3 } ] // Only this category is competing.. const competingCategory = Math.min(...cars.filter(car => car.competes).map(({category}) => category)); const competingCars = cars.filter(car => car.competes && car.category === competingCategory); console.log('Competing cars (example II):', competingCars) .as-console-wrapper { max-height: 100% !important; top: 0; }En primer lugar, ordena la matriz según la categoría y luego filtra una matriz con los autos que van a competir
const cars = [ { name: "red", competes: true, category: 1 }, { name: "blue", competes: false, category: 1 }, { name: "green", competes: true, category: 2 }, { name: "yellow", competes: true, category: 3 } ] const sorted = cars.sort((a, b) => a.category - b.category); const compete = sorted.filter(x => x.competes && x.category == sorted[0].category); console.log(compete[0]);