Estoy trabajando en grandes conjuntos de datos de productos y necesito filtrar la lista de productos según el valor de entrada del usuario. El conjunto de datos de mi producto se parece a esto:
const products = [ {id: 0, name: "Product1", brand: "Theraflu", itemCode: "THE110", price: 5.45}, {id: 1, name: "Product2", brand: "Benadryl", itemCode: "BEN121", price: 7.05}, {id: 2, name: "Product3", brand: "Listerine", itemCode: "LIS204", price: 4.55}, {id: 3, name: "Product4", brand: "Tylenol", itemCode: "TYL116", price: 6.10}, ];Pude filtrar la lista de productos según los diferentes campos disponibles en cada objeto de producto individual como este:
const keys = ["name", "brand", "itemCode"]; const getFilteredProducts = (filterText) => { const newProducts = products.filter(product => keys.some(key => product[key].toLowerCase().includes(filterText.toLowerCase()))); return newProducts; } console.log(getFilteredProducts("Tylenol"));Este código realmente funciona cuando filtro el producto según el campo individual. Sin embargo, cuando trato de combinar diferentes campos como:
console.log(getFilteredProducts("product4 Tylenol"));El valor devuelto de esto es una matriz vacía. ¿Hay alguna manera de lograr esto sin alterar la funcionalidad de filtrado existente?
Parece que tendrá que buscar cada palabra del filterText por sí solo. Tal vez algo como esto:
const keys = ["name", "brand", "itemCode"]; const getFilteredProducts = (filterText) => { const filterWords = filterText.split(" "); const newProducts = []; for (const word of filterWords) { newProducts.push( products.filter(product => keys.some(key => product[key].toLowerCase().includes(word.toLowerCase()) )) ); } return [].concat(...newProducts).filter((value, index, self) => self.findIndex((m) => m.id === value.id) === index ); } console.log(getFilteredProducts("Tylenol Product3"));