Me enfrento a un problema y no entiendo cómo puedo resolverlo.
Tengo un servicio donde devuelvo el siguiente JSON:
{ "data": [ { "data": 179, "data_form": "Finished - Form Covid-19 Test 1", "form": 144, "user": 1, "status": "Finished" }, { "data": 176, "data_form": "In process - Form Covid-19 Test 2", "form": 144, "user": 1, "status": "Finished" }, { "data": 177, "data_form": "Finished - Form Covid-19 Test 3", "form": 144, "user": 1, "status": "In process" }, { "data": 178, "data_form": "Finished - Form Covid-19 Test 4", "form": 144, "user": 1, "status": "In process" } ] }Estoy usando un PIPE donde le envío mi matriz, el valor que quiero filtrar y la columna donde está ese valor:
<ion-list *ngFor="let form of forms | filter: searchValue: ['status','data_form','data']"> <app-form-user [form]="form"> </app-form-user> </ion-list>Funciona si indico la columna:
return array.filter( //It works item=> item[column[0]].toLowerCase().includes( text ) );La idea es buscar el valor en todas las columnas que le indicas al pipe, yo probé lo siguiente:
1.
return array.filter( item=> item[column.forEach((data) => found = data )].toLowerCase().includes( text ); ); return array.filter( item=>Object.keys(column).every(key => item[key] == column[key] ) ); return array.filter( item=> column.forEach((data) => item[data].toLowerCase().includes( text )) );Espero que me puedas ayudar, gracias.
Funciona sin necesidad de pasar la columna, busca todas las columnas disponibles.
Código de una línea
Este filtro pasa por cada clave que tiene para verificar los valores y devolver el resultado.
Explicación detallada:
1) Base is the object you posted and assuming you want to filter the "data" 2) First filter goes thru all the elements in the array 3) second filter goes thru all the keys in the object which is element in the array 4) Checking if the column has the data 5) returns the array of elements if matched const text = 'Test 2'; return array.filter(v=> Object.keys(v).filter(key=> v[key].toString().toLowerCase().includes(text.toString().toLowerCase())).length > 0)Y el resultado es:
Usaré .map() para revisar cada clave de cada elemento, y decidir si encontró los valores específicos o no, y devolverlo en el nivel de filtro
return array.filter(item => { let found = false; Object.keys(item).map(x => { found = found || item[x].toLowerCase().includes( text ); }); return found; });