const cars = [ { brand: "Chevrolet", model: "Camaro", dates: (3) ['2022/05/28', '2022/06/02', '2022/06/05'] }, { brand: "Chevrolet", model: "Camaro", dates: (3) ['2022/05/30', '2022/06/02', '2022/06/05'] }, { brand: "Chevrolet", model: "Camaro", dates: (3) ['2022/05/28', '2022/06/01', '2022/06/05'] } ]Quiero filtrar mi matriz de objetos en función de otra matriz
const arr2 = ["2022/06/02", "2022/06/05"];Quiero obtener resultados como ese;
[ { brand: "Chevrolet", model: "Camaro", dates: (3) ['2022/05/28', '2022/06/02', '2022/06/05'] }, { brand: "Chevrolet", model: "Camaro", dates: (3) ['2022/05/30', '2022/06/02', '2022/06/05'] } ]utilicé incluye
let filtered = cars.filter((item) => item.dates.includes(arr2))Tengo una matriz vacía.
cuando paso una cadena para incluir, obtuve una matriz filtrada.
let filtered = cars.filter((item) => item.dates.includes("2022/06/02"))No, necesito comparar arr2 . Su longitud podría cambiarse.
¿Cómo puedo pasar una matriz a la función cars.include()
[{}, {}].includes({}) devuelve false porque compara objetos por referencia de objeto, no valores en el objeto, por lo que es equivalente a
const a = {}; // new, empty object const b = {}; // a different new, empty object const c = {}; // yet another new, empty object const answer = [a, b].includes(c) // falseAdemás, ¡las matrices son objetos!
Por eso, cuando pasas un objeto (sea o no una matriz) a Array.prototype.includes, devuelve false a menos que ese mismo objeto sea un elemento de la matriz.
Probablemente quieras algo como esto:
// Function that returns true if two arrays intersect const includesAny = (arr1, arr2) => arr1.some(e1 => arr2.includes(e1)); const filterCarsByDates = ( datesSought => cars.filter( car => includesAny( cars.dates, datesSought ) ) ); let cars = [ { brand: "Chevrolet", model: "Camaro", dates: ['2022/05/28', '2022/06/02', '2022/06/05'] }, { brand: "Chevrolet", model: "Camaro", dates: ['2022/05/30', '2022/06/02', '2022/06/05'] }, { brand: "Chevrolet", model: "Camaro", dates: ['2022/05/28', '2022/06/01', '2022/06/05'] } ]; let arr2 = ["2022/06/02", "2022/06/05"]; // A method that checks if `src` array contains all elements of `target` array let checker = (src, target) => target.every(v => src.includes(v)); let filtered = cars.filter((item) => checker(item.dates, arr2)); console.log(filtered);Puede usar Array Filter con Set, Buscar en Set es más rápido que Array.
const cars = [ { brand: "Chevrolet", model: "Camaro", dates: ["2022/05/28", "2022/06/02", "2022/06/05"], }, { brand: "Chevrolet", model: "Camaro", dates: ["2022/05/30", "2022/06/02", "2022/06/05"], }, { brand: "Chevrolet", model: "Camaro", dates: ["2022/05/28", "2022/06/01", "2022/06/05"], }, ]; const arr2 = ["2022/06/02", "2022/06/05"]; const result = cars.filter((car) => { const set = new Set(car.dates); return arr2.every((date) => set.has(date)); }); console.log(result);