Sé que esta pregunta se ha hecho antes, pero las soluciones existentes no parecen funcionar para mi caso. Estoy tratando de filtrar datos sobre la base de múltiples propiedades/valores en una variedad variada de objetos.
Mis datos de muestra se ven así:
const products = [ { name: 'A', color: 'Blue', size: 50, locations: 'USA' }, { name: 'B', color: 'Blue', size: 60, locations: 'Europe' }, { name: 'C', color: 'Blue', size: 30, locations: 'Europe' }, { name: 'D', color: 'Black', size: 70, locations: 'Japan' }, { name: 'E', color: 'Green', size: 50, locations: 'Europe' }, { name: 'F', color: 'Blue', size: 50, locations: 'Brazil' }, { name: 'G', color: 'Black', size: 40, locations: 'Australia' }, ];Esto es lo que necesito que sea el resultado de los filtros:
const filters_one = ['Blue']; const requiredResult_One = [ { name: 'A', color: 'Blue', size: 50, locations: 'USA' }, { name: 'B', color: 'Blue', size: 60, locations: 'Europe' }, { name: 'C', color: 'Blue', size: 30, locations: 'Europe' }, { name: 'E', color: 'Blue', size: 50, locations: 'Brazil' }, ] const filters_two = ['Blue', 'Europe']; const requiredResult_Two = [ { name: 'B', color: 'Blue', size: 60, locations: 'Europe' }, { name: 'C', color: 'Blue', size: 30, locations: 'Europe' }, ] ----------OR------------------------- const filters_three = ['Black']; const requiredResult_three = [ { name: 'D', color: 'Black', size: 70, locations: 'Japan' }, { name: 'G', color: 'Black', size: 40, locations: 'Australia' }, ] const filters_four = ['Black', 'Japan']; const requiredResult_Four = [ { name: 'D', color: 'Black', size: 70, locations: 'Japan' }, ]esto es lo que he logrado hasta ahora:
const filterdata = (products, filter) => { // where, filter can be equal to *filters_one*, *filters_two*, *filters_three*, or *filters_four* anyone of it. // const keysExact = ['color', 'locations']; const valuesExact = filter.map(col => col.toLowerCase()); const resultExact = products.filter((prod) => keysExact.every((key) => valuesExact.includes(prod[key].toLowerCase())) ); console.log(resultExact); };Esto parece funcionar parcialmente o no me parece un buen enfoque. Si alguien puede ayudarme con una mejor solución en esto, será realmente útil.
¡Gracias por adelantado!
Puede obtener los valores del objeto y verificar si todos los valores de la consulta están en la matriz de valores.
const filter = (data, query) => data.filter(o => { const values = Object.values(o); return query.every(q => values.includes(q)); }), products = [{ name: 'A', color: 'Blue', size: 50, locations: 'USA' }, { name: 'B', color: 'Blue', size: 60, locations: 'Europe' }, { name: 'C', color: 'Blue', size: 30, locations: 'Europe' }, { name: 'D', color: 'Black', size: 70, locations: 'Japan' }, { name: 'E', color: 'Green', size: 50, locations: 'Europe' }, { name: 'F', color: 'Blue', size: 50, locations: 'Brazil' }, { name: 'G', color: 'Black', size: 40, locations: 'Australia' }]; console.log(filter(products, ['Blue'])); console.log(filter(products, ['Blue', 'Europe'])); console.log(filter(products, ['Black'])); console.log(filter(products, ['Black', 'Japan'])); console.log(filter(products, [['Blue', 'Green']])); .as-console-wrapper { max-height: 100% !important; top: 0; }Un enfoque para valores alternativos de la misma clave.
const filter = (data, query) => data.filter(o => { const values = Object.values(o); return query.every(q => values.includes(q) || Array.isArray(q) && q.some(v => values.includes(v)) ); }), products = [{ name: 'A', color: 'Blue', size: 50, locations: 'USA' }, { name: 'B', color: 'Blue', size: 60, locations: 'Europe' }, { name: 'C', color: 'Blue', size: 30, locations: 'Europe' }, { name: 'D', color: 'Black', size: 70, locations: 'Japan' }, { name: 'E', color: 'Green', size: 50, locations: 'Europe' }, { name: 'F', color: 'Blue', size: 50, locations: 'Brazil' }, { name: 'G', color: 'Black', size: 40, locations: 'Australia' }]; console.log(filter(products, ['Blue'])); console.log(filter(products, [['Blue', 'Green']])); .as-console-wrapper { max-height: 100% !important; top: 0; }const filterArray = (filter, arr) => { return arr.filter(val => (filter[1] ? val.color === filter[0] && val.locations === filter[1] : val.color === filter[0])); };Puede crear un filtro basado en el color y la location
const products = [ { name: 'A', color: 'Blue', size: 50, locations: 'USA' }, { name: 'B', color: 'Blue', size: 60, locations: 'Europe' }, { name: 'C', color: 'Blue', size: 30, locations: 'Europe' }, { name: 'D', color: 'Black', size: 70, locations: 'Japan' }, { name: 'E', color: 'Green', size: 50, locations: 'Europe' }, { name: 'F', color: 'Blue', size: 50, locations: 'Brazil' }, { name: 'G', color: 'Black', size: 40, locations: 'Australia' }, ]; function filterProducts(filterParams) { const [color, country] = filterParams; const output = products.filter((product) => product.color === color && (country ? product.locations === country : true)) return output; } const filters_one = ['Blue']; const requiredResult_One = filterProducts(filters_one); console.log(requiredResult_One); const filters_two = ['Blue', 'Europe']; const requiredResult_Two = filterProducts(filters_two); console.log(requiredResult_Two); const filters_three = ['Black']; const requiredResult_three = filterProducts(filters_three); console.log(requiredResult_three); const filters_four = ['Black', 'Japan']; const requiredResult_Four = filterProducts(filters_four); console.log(requiredResult_Four);