Tengo una lista de objetos como este.
results = [ { id: 1, status : "Active" // Some other fields tags : [{val: 'IGM', color: 'light-success' }, {val: 'Gated Out', color: 'light-primary' }, ] }, // ... ]
ahora quiero filtrar objetos en relación con las etiquetas, la entrada para filtrar la lista también tiene la forma de una matriz usando una entrada de selección múltiple.
me gusta
[{value: 'Gated Out', label: 'GATED OUT'}, .. ]
Puedo filtrar datos de otros campos pero no las etiquetas porque otros campos están en cadenas y las etiquetas son una matriz.
Pero ahora, ¿cómo puedo modificar esto para que funcione también con la matriz?
Estoy usando ese enfoque;
const handleTagsFilter = (value) => { let updatedData = [] const dataToFilter = () => { if ( status.length || custom_tags.length ) { return filteredData } else { return results } } setCustomTags(value) if (value.length) { updatedData = dataToFilter().filter((item) => { const startsWith = item.status.toLowerCase().startsWith(value.toLowerCase()) const includes = item.status.toLowerCase().includes(value.toLowerCase()) if (startsWith) { return startsWith } else if (!startsWith && includes) { return includes } else return null }) setFilteredData([...updatedData]) setCustomTags(value) } }
Esa función funciona con cadenas de filtrado como si tuviéramos el campo de estado en Activo que este trabajo, pero no estoy seguro de cómo puedo modificarlo para que funcione también con la matriz.
Tal vez algo como:
let search_str = 'abc'.toLowerCase(); let filtered_results = results .map(v => v.tags.filter(_v => _v.val.toLowerCase().includes(search_str))) .filter(v => v.length) .reduce((a, b) => a.concat(...b), [])