Quiero poder filtrar por estado y prioridad, pero también poder tener múltiples tipos de prioridad o estado, por ejemplo:
[ { "id": 1, "status": "IN_PROGRESS", "priority": "NONE", "inspectorId": 2, "reportAt": "2021-08-09T12:06:03+00:00", "scheduledFor": "2021-08-12T12:06:03+00:00", }, { "id": 2, "status": "WAITING", "priority": "HIGH", "inspectorId": 2, "reportAt": "2021-08-09T12:06:03+00:00", "scheduledFor": "2021-08-12T12:06:03+00:00", }, { "id": 3, "status": "COMPLETED", "priority": "NONE", "inspectorId": 2, "reportAt": "2021-08-09T12:06:03+00:00", "scheduledFor": "2021-08-12T12:06:03+00:00", }, ] Actualmente estoy usando .filter para filtrar con el valor que elijo, pero cada vez que elijo más de un valor para la misma propiedad ("ESPERANDO" y "EN PROGRESO" para el estado) obtengo una matriz vacía como retorno.
Aquí está mi código:
allRequests.filter((item) => { if (filters !== {}) { for (const key in filters) { if (item[key] === undefined || item[key] != filters[key]) { return null; } } } return item; })Javascript array.filter espera una función de predicado y devuelve un conjunto filtrado de elementos de matriz en función de esa función de predicado.
En lugar de devolver un elemento, debe devolver un valor booleano de true o false . Esta podría ser la razón por la que se enfrenta a este problema.
Para filtrar por múltiples estados y prioridades, cree un objeto de filtros como el siguiente:
const filters = { "status": ["COMPLETED", "IN_PROGRESS"], "priority": ["NONE"] };luego actualice su código a:
allRequests.filter((item) => { if (Object.keys(filters).length > 0) { for (let key in filters) { if (item[key] === undefined || !filters[key].includes(item[key])) { return false; } } } return true; })ver :
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter
https://zetcode.com/javascript/array-filter/
Puede encontrar un ejemplo de trabajo a continuación:
const allRequests = [ { "id": 1, "status": "IN_PROGRESS", "priority": "NONE", "inspectorId": 2, "reportAt": "2021-08-09T12:06:03+00:00", "scheduledFor": "2021-08-12T12:06:03+00:00", }, { "id": 2, "status": "WAITING", "priority": "HIGH", "inspectorId": 2, "reportAt": "2021-08-09T12:06:03+00:00", "scheduledFor": "2021-08-12T12:06:03+00:00", }, { "id": 3, "status": "COMPLETED", "priority": "NONE", "inspectorId": 2, "reportAt": "2021-08-09T12:06:03+00:00", "scheduledFor": "2021-08-12T12:06:03+00:00", }, ]; const filters = { "status": ["COMPLETED", "IN_PROGRESS"], "priority": ["NONE"] }; const result = allRequests.filter((item) => { if (Object.keys(filters).length > 0) { for (let key in filters) { if (item[key] === undefined || !filters[key].includes(item[key])) { return false; } } } return true; }); console.log(result);