Filtre la matriz con objetos basados en otra matriz dinámicamente.
Necesito filtrar una matriz principal usando otra matriz. Pero la matriz de filtros solo contendrá unos pocos campos o varios.
var codes = [{ "title": "lore", "city": "New York", "desc": "lorem lorem", "age": "32" }, { "title": "lore2 ", "city": "Santa Monica", "desc": "lorem2", "age": "20" } ]; let filter = [{ "city": "New York" }, { "age": "20" },...O más filtros. Este filtro lo crea dinámicamente la persona que hace clic en la casilla de verificación.
]
Esto debería funcionar
let codes = [{ "title": "lore", "city": "New York", "desc": "lorem lorem", "age": "20" }, { "title": "lore2 ", "city": "Santa Monica", "desc": "lorem2", "age": "20" } ]; let filter = [{ "city": "New York" }, { "age": "20" }]; let res = codes.filter(code => { return filter.every(f => { const [key, value] = Object.entries(f)[0]; return code[key] == value }); }); console.log(res)Podría tomar una mejor estructura de datos que sea más fácil de usar en lugar de claves desconocidas.
Como resultado, obtiene un objeto que coincide con todas las claves/valores.
const codes = [{ title: "lore", city: "New York", desc: "lorem lorem", age: "32" }, { title: "lore2 ", city: "New York", desc: "lorem2", age: "20" }], filter = [{ key: "city", value: "New York" }, { key: "age", value: "20" }], result = codes.filter(o => filter.every(({ key, value }) => o[key] === value)); console.log(result);¿Quizás algo como esto podría funcionar para ti?
Básicamente, recorrer los filtros y luego también los pares clave-valor de los objetos de filtro separados y compararlos con los códigos.
var codes = [{ "title": "lore", "city": "New York", "desc": "lorem lorem", "age": "32" }, { "title": "lore2 ", "city": "Santa Monica", "desc": "lorem2", "age": "20" }]; var filters = [{"city": "New York"}, {"age": "32"}]; function filterByMultipleFilters(data, filters) { return data.filter(item => { // Loop through all filters and check the current item for (const filter of filters) { for (const [key, value] of Object.entries(filter)) { if (!item[key] || item[key] !== value) return false; } } return true; }); } console.clear(); let result = filterByMultipleFilters(codes, filters); console.log(result);