Me gustaría filtrar una matriz de objetos. La matriz es una lista de clases de deporte y los objetos son las clases.
Se parece a esto :
const list = [{category: "yoga", level: "beginner", duration: "15 minutes"}]Tengo que aplicar filtro para que el usuario pueda elegir entre categoría (yoga, pilates...) nivel (principiante, avanzado...).
Necesito encontrar la intersección del filtro, lo que significa que si se seleccionan "yoga" y "principiante", me gustaría devolver solo clases de yoga para principiantes .
El usuario puede convertir en verdadero/falso las variables beginnnerFilter, etc. y las variables cardio/yoga, etc. Entonces, si el filtro de yoga es verdadero, yogaFilter = "yoga". Si es falso, yogaFilter = ""
Ejemplo:
function filterIntersect() { let filteredListCategory = []; let filteredListLevel = []; for(let i = 0; i < list.length; i++) { if (list[i].category.toLowerCase() === cardio) { filteredListCategory.push(list[i]) } else if (list[i].category.toLowerCase() === yoga) { filteredListCategory.push(list[i]) } else if (list[i].category.toLowerCase() === boxing) { filteredListCategory.push(list[i]) } else if (list[i].category.toLowerCase() === dance) { filteredListCategory.push(list[i]) } else if (list[i].category.toLowerCase() === pilates) { filteredListCategory.push(list[i]) } else if (list[i].category.toLowerCase() === stretching) { filteredListCategory.push(list[i]) } } if (allFilterCategory === true) { filteredListCategory = [...list]; } for(let k = 0; k < list.length; k++) { if (list[k].level.toLowerCase() === beginnerFilter) { filteredListLevel.push(list[k]) } else if (list[k].level.toLowerCase() === intermediateFilter) { filteredListLevel.push(list[k]) } else if (list[k].level.toLowerCase() === advancedFilter) { filteredListLevel.push(list[k]) } } if (allFilterLevel === true) { filteredListLevel = [...list]; } let finalList = filteredListCategory.filter(item=> filteredListLevel.includes(item)); return finalList.length === 0 ? list : finalList; }Logro devolver una matriz filtrada pero no funciona como se esperaba. A veces, los filtros no se aplican y tengo la lista completa en lugar de la lista filtrada. No estoy seguro de que el ciclo for sea apropiado aquí. También intenté usar el nuevo Set pero tampoco funcionaba. Muchas gracias.
Puede usar el método .filter y .some de matrices en lugar de declaraciones if y bucles for . P.ej
const categoryChoices = [ { category: "yoga", checked: false }, { category: "meditation", checked: true }, { category: "pilates", checked: false }, { category: "cardio", checked: true }, ]; const levelsChoices = [ { level: "beginner", checked: true }, { level: "intermediate", checked: true }, { level: "advanced", checked: false }, ]; const data = [ { category: "yoga", level: "beginner", duration: '30 minutes' }, { category: "yoga", level: "intermediate", duration: '60 minutes' }, { category: "yoga", level: "advanced", duration: '90 minutes' }, { category: "meditation", level: "beginner", duration: '30 minutes' }, { category: "meditation", level: "intermediate", duration: '60 minutes' }, { category: "meditation", level: "advanced", duration: '90 minutes' }, { category: "pilates", level: "beginner", duration: '30 minutes' }, { category: "pilates", level: "intermediate", duration: '60 minutes' }, { category: "pilates", level: "advanced", duration: '90 minutes' }, { category: "cardio", level: "beginner", duration: '30 minutes' }, { category: "cardio", level: "intermediate", duration: '60 minutes' }, { category: "cardio", level: "advanced", duration: '90 minutes' }, ]; const checkedCategories = categoryChoices .filter((c) => c.checked) .map((c) => c.category); const checkedLevels = levelsChoices .filter((l) => l.checked) .map((l) => l.level); const filteredData = data.filter( ({ category, level }) => checkedCategories.some((c) => c === category) && checkedLevels.some((l) => l === level) ); console.log(filteredData);