Esto podría ser un duplicado, pero parece que no puedo encontrar una pregunta de stackoverflow con mi pregunta exacta. Estoy mostrando una tabla de datos en la interfaz y permito que el usuario filtre por múltiples variables opcionales. Entonces, digamos que mis variables de datos son detalles de usuario en este formato:
[ { firstName = 'bob', middleName = 'bruh', lastName = 'bub' }, . . . { firstName = 'sam', middleName = 'marley', lastName = 'jackson' } ]Ahora estoy permitiendo a los usuarios filtrar por nombre, segundo nombre y apellido. Pero también se les permite filtrar usando solo una variable, o una combinación de cualquiera de las tres.
El enfoque ingenuo que estoy usando ahora es tener 7 declaraciones if que filtran la matriz según la entrada del usuario:
asi que
let filterByFirstName = this.firstNameQuery !== null; let filterByMiddleName = this.middleNameQuery !== null; let filterByLastName = this.lastNameQuery !== null; if(filterByFirstName && !filterByMiddleName && !filterByLastName) //filter the array only by first name else if(filterByFirstName && filterByMiddleName && !filterByLastName) // filter array by first and middle name . . . else if(filterByFirstName && filterByMiddleName && filterByLastName) //filter array by first, middle and last name.Entonces, algorítmicamente es lo suficientemente eficiente, pero no tanto por la limpieza del código, ya que agregaré más y más variables para filtrar.
Intenté crear solo una declaración de filtro que filtrará según las variables proporcionadas, pero tengo problemas para codificarla.
let filterByFirstName = this.firstNameQuery !== null; let filterByMiddleName = this.middleNameQuery !== null; let filterByLastName = this.lastNameQuery !== null; this.displayArray = this.userArray.filter( user => user.firstName === (filterByFirstName ? this.firstNameQuery : 'any String') && user.middleName === (filterByMiddleName ? this.middleNameQuery : 'any String') && user.lastName === (filterByLastName ? this.lastNameQuery : 'any String') );Entonces, esencialmente, lo que necesito es un comodín o el equivalente de cualquier cadena para poner en la función de filtro, si esto es posible. Gracias por adelantado :)
Tal vez algo como:
let filters = {firstName: 'John', middleName: 'Foo', lastName: null} let data = [{firstName: 'John', middleName: 'Foo', lastName: 'Doe'}] console.log(data.filter((item) => { for (const [key, value] of Object.entries(filters)) { if (value) return item[key] === value } }))