javascript - Función de filtro genérica sin conocer la(s) clave(s)
Quiero crear un método genérico en JavaScript que filtre una lista sin conocer la(s) clave(s).
Esto es lo lejos que he llegado, y no sé cómo continuar. Sé que este código foreach no es correcto, pero lo escribí así para que pudieras entender más fácilmente lo que estoy tratando de hacer.
¿Alguien que pueda ayudar?
filterList(): void {
let searchtext = this.state.currentSearchBoxValue;
let searchProperties = this.state.searchBoxOptions.searchProperties;
let list = this.props.list;
if(searchtext != undefined && searchtext != '' && searchtext != null)
{
let keys = Object.keys(list[0]);
searchProperties.forEach(key => {
list.filter(item => item[key].includes(searchtext));
})
}
}
Respuesta #1
Quizás podrías revisar la lógica de filtrado, de manera que la función de devolución de llamada pasada a filter() en tu arreglo list envuelva la iteración de searchProperties como se detalla a continuación:
filterList(): void {
let searchtext = this.state.currentSearchBoxValue;
let searchProperties = this.state.searchBoxOptions.searchProperties;
let list = this.props.list;
if(searchtext != undefined && searchtext != '' && searchtext != null)
{
/* Call filter to filter items that match search criteria */
const filteredList = list.filter(item => {
/* Search for any property where the some() criteria is true for
current item */
return searchProperties.some(searchProperty => {
/* If item value on current searchProperty key includes searchText,
return true. This means some() will return true, and
the "item" will be included in filteredList */
const itemPropertyValue = item[ searchProperty ];
return itemPropertyValue.includes(searchtext);
});
});
/* Filtered result */
console.log(filteredList);
}
}
Como se muestra arriba, esta solución utiliza el método .some() en el arreglo searchProperties, el cual devuelve true si la función de devolución de llamada pasada a some() devuelve true para algún elemento del arreglo searchProperties.
¡Espero que eso ayude!
