Llevo dos días intentando hacer esta función y no lo consigo. Me gustaría que la función me devuelva los objetos que satisfacen la matriz de filtros. El problema es que me gustaría que devuelva solo objetos que satisfagan todos los filtros.
Mi matriz de filtros:
const myFiltersIngredients = ['farinha', 'frango']Mi matriz de objetos:
const myRecipes = [ { name: 'torta da vovo', ingredients: [ { ingredient: 'farinha', ingredientUnit: 'grama(s)', ingredientQuantity: 500 }, { ingredient: 'frango', ingredientUnit: 'grama(s)', ingredientQuantity: 500 } ] }, { name: 'biscoito', ingredients: [ { ingredient: 'farinha', ingredientUnit: 'grama(s)', ingredientQuantity: 500 }, { ingredient: 'manteiga', ingredientUnit: 'grama(s)', ingredientQuantity: 500 } ] } ] const myFiltersIngredients = ['farinha', 'frango']; const myRecipes = [{ name: 'torta da vovo', ingredients: [{ ingredient: 'farinha', ingredientUnit: 'grama(s)', ingredientQuantity: 500 }, { ingredient: 'frango', ingredientUnit: 'grama(s)', ingredientQuantity: 500 } ] }, { name: 'biscoito', ingredients: [{ ingredient: 'farinha', ingredientUnit: 'grama(s)', ingredientQuantity: 500 }, { ingredient: 'manteiga', ingredientUnit: 'grama(s)', ingredientQuantity: 500 } ] } ]; const myFiltered = myRecipes.filter(({ ingredients }) => myFiltersIngredients.every(myfilter => ingredients.map(({ ingredient }) => ingredient).includes(myfilter))); console.log( myFiltered );Espero que esta pequeña demostración te ayude a orientarte en la dirección correcta.
Aquí hay un enlace a la documentación del método .filter y .every array.
Como breve explicación:
El método .filter toma una función como argumento y ejecutará la función con cada objeto en la matriz. La función devolverá verdadero o falso. La matriz devuelta por .filter serán todos los elementos de la matriz que devolvieron verdadero según la función proporcionada.
El método .every toma una función como argumento y devuelve verdadero si todos los elementos de la matriz, cuando se pasan al argumento de la función, devuelven verdadero.
En mi código, primero declaro que quiero filtrar todas las recetas y devolver la matriz filtrada a una variable. La función que se pasa como argumento solo tiene una línea, que verifica el objeto para asegurarse de que todos los ingredientes asociados con ese objeto estén incluidos en la matriz myFiltersIngredients .
const myFiltersIngredients = ['farinha', 'frango']; const myRecipes = [ { name: 'torta da vovo', ingredients: [ { ingredient: 'farinha', ingredientUnit: 'grama(s)', ingredientQuantity: 500 }, { ingredient: 'frango', ingredientUnit: 'grama(s)', ingredientQuantity: 500 } ] }, { name: 'biscoito', ingredients: [ { ingredient: 'farinha', ingredientUnit: 'grama(s)', ingredientQuantity: 500 }, { ingredient: 'manteiga', ingredientUnit: 'grama(s)', ingredientQuantity: 500 } ] } ]; const filteredRecipes = myRecipes.filter(o => { return o.ingredients.every( ({ingredient}) => myFiltersIngredients.includes(ingredient) ); }); console.log(filteredRecipes);