Estoy escribiendo un filtro para mostrar solo ciertos elementos basados en palabras clave. Así que tengo una serie de objetos en este formato clave/par:
name: "Accounting (AAS) | Business, Design & Hospitality Pathway", type: "associate of arts", method: "classroom based", location: "centennial campus", pathway: "business, design, & hospitality", time: "4 semesters", transfer: "transferable"Tengo un objeto que estoy creando a partir de los botones de radio. Se llama filtros seleccionados. Si solo se marca una radio, devolvería esto:
{type: 'associate of arts'}Si se marcan dos radios:
{type: 'associate of arts', method: 'hyflex class'}Entonces, el segundo objeto no tiene todas las propiedades del primer objeto. Necesito verificar si las propiedades que tienen en común coinciden. Entonces, si el objeto creado por los botones de radio tiene dos propiedades. Solo quiero que los objetos regresen si ambas propiedades coinciden.
Tengo una instrucción if en mi bucle forEach. Pero solo regresa si todas las propiedades coinciden. ¿Alguien puede encontrar una solución para que solo empuje los objetos donde coinciden las propiedades que existen?
data.forEach(function(el) { if ( el.type == selectedFilters.type && el.method == selectedFilters.method && el.location == selectedFilters.location && el.pathway == selectedFilters.pathway && el.time == selectedFilters.time && el.transfer == selectedFilters.transfer ) { result.push(el); }; });Use Object.entries() y Array.every() para filtrar las entradas del objeto de radio contra la matriz de datos
const radioObj = { A: 1, C: 2 }, radioEntries = Object.entries(radioObj), data = [{ A: 1, B: 3, C: 2 }, { A: 2, B: 2, C:2 } ] const res = data.filter(e => radioEntries.every(([k,v]) => e[k] === v)) console.log(res)En primer lugar, los botones de radio solo tendrán una selección posible. Estás buscando casillas de verificación.
Ahora, si entiendo tu problema correctamente, te estás equivocando porque siempre estás revisando cada propiedad en tu objeto candidato. Lo que debe hacer es iterar a través de su "objeto que está creando a partir de los botones de opción" ( selectedFilters en mi código de ejemplo), verificando si el valor de cada una de esas propiedades es igual al valor en su objeto candidato.
Aquí hay un ejemplo:
let objs = [ { name: "Accounting (AAS) | Business, Design & Hospitality Pathway", type: "associate of arts", method: "classroom based", location: "centennial campus", pathway: "business, design, & hospitality", time: "4 semesters", transfer: "transferable" }, { name: "Accounting (AAS) | Business, Design & Hospitality Pathway", type: "associate of arts", method: "classroom based", location: "centennial campus", pathway: "art, music and history", time: "4 semesters", transfer: "transferable" }, { name: "Accounting (AAS) | Business, Design & Hospitality Pathway", type: "associate of science", method: "classroom based", location: "centennial campus", pathway: "business, design, & hospitality", time: "4 semesters", transfer: "transferable" }, ] let selectedFilters = { type: "associate of arts", method: "classroom based", } function checkObj(obj, selectedFilters) { for (x in selectedFilters) { if (obj[x] !== selectedFilters[x]) return false; } return true; } let result = []; for (obj of objs) { if (checkObj(obj, selectedFilters)) result.push(obj) } console.log(result); En la prueba, estoy usando filtros selectedFilters con dos propiedades seleccionadas. De los objetos de la matriz, el tercero no debe seleccionarse porque la propiedad de type es diferente. Por lo tanto, la función checkObj simplemente se ejecuta a través de las propiedades de los filtros selectedFilters y las compara con el objeto pasado. Dado que itera a través del objeto de verificación, ignora cualquier propiedad que el objeto de verificación no tenga.
Entonces, recorre la matriz de objetos candidatos, llamando a la función objCheck para cada uno. Cada vez que la función devuelve verdadero (porque todas las propiedades en los filtros selectedFilters coinciden con las mismas propiedades en el objeto candidato, ignorando las propiedades que no están en selectedFilters ), el objeto se inserta en la matriz de resultados.
Puedes mapear el objeto así
const data = [{ name: "Accounting (AAS) | Business, Design & Hospitality Pathway", type: "associate of arts", method: "classroom based", location: "centennial campus", pathway: "business, design, & hospitality", time: "4 semesters", transfer: "transferable" }] const selectedFilters = { type: 'associate of arts', transfer: "transferable" } const res = data.reduce((acc, entry) => { // for each key in filter check if the value of the entry matches the filter value // only do the check if the filter value has not been set to false // if all filter values pass push the object, else just return the original array return Object .keys( selectedFilters ) .reduce( ( ok, key ) => { return ok ? selectedFilters[key] === entry[key] : false; }, true ) ? acc.concat( entry ) : acc; } , []) console.log(res);