hay una lista de usuarios
filterData = [ { "position":"lawyer", "department_positions":[], "group_positions":[ {"group":{"id":2,"code":"234","name":"group1"},"lead":false}, {"group":{"id":1,"code":"123","name":"group12"},"lead":true} ] }, { "position":"director", "department_positions":[ {"department":{"id":3,"code":"333","name":"subDep"},"lead":false} ], "group_positions":[ {"group":{"id":2,"code":"234","name":"group1"},"lead":false}, {"group":{"id":1,"code":"123","name":"group12"},"lead":true} ] }, { "position":"director", "department_positions":[], "group_positions":[] } ]y lista de filtros
categories = { "position":["lawyer","director"], "group_positions":["group1","group12"], "department_positions":["generalDep", "subDep"] }Es necesario filtrar a los usuarios teniendo en cuenta que se pueden seleccionar varios filtros a la vez. Por ejemplo, quiero encontrar un usuario con cargo = "director" y AND group_positions = "group1" AND department_positions = "subDep"
mi código no permite el filtrado por múltiples condiciones. ¿Cómo puedo arreglarlo?
this.filter = this.filterData.filter(item => { for (let key in this.categories) { if (item[key].find(el => this.categories[key].includes( el.group?.name || el.department?.name ) )) { return true } } return false })}Puedes intentar algo como esto:
let filtered = example.filter(item => { let valid = false if (item.includes('something')) { valid = true } if (!valid) { // check second condition } return valid })Utilice un marcador de posición temporal para que no tenga que devolver inmediatamente verdadero/falso.
Este es un buen lugar para emplear una clase es6 para dar comportamiento al objeto que se filtra. Aumente cada objeto para determinar si coincide con el objeto de "categoría".
(a partir de los datos de ejemplo, esto supone que el OP está buscando una coincidencia de "producto de sumas": todas las claves de categoría coinciden con al menos uno de los valores de categoría)
class FilterMe { constructor(item) { Object.assign(this, item); } namesForKey(key) { switch (key) { case 'position': return [this.position]; // always answer an array case 'group_positions': return this.group_positions.map(gp => gp.group.name); case 'department_positions': return this.department_positions.map(dp => dp.department.name); default: return []; } } // return true if a single filter key-value pair is matched matchesFilterKeyValue(filterKey, filterOptions) { const myNames = this.namesForKey(filterKey); const matches = filterOptions.filter(e => myNames.includes(e)); return matches.length > 0; } // return true if all filter key-values pairs are matched matchesFilter(filter) { return Object.entries(filter).every(keyValue => { return this.matchesFilterKeyValue(...keyValue); }) } } const filterData = [{ "position": "lawyer", "department_positions": [], "group_positions": [{ "group": { "id": 2, "code": "234", "name": "group1" }, "lead": false }, { "group": { "id": 1, "code": "123", "name": "group12" }, "lead": true }] }, { "position": "director", "department_positions": [{ "department": { "id": 3, "code": "333", "name": "subDep" }, "lead": false }], "group_positions": [{ "group": { "id": 2, "code": "234", "name": "group1" }, "lead": false }, { "group": { "id": 1, "code": "123", "name": "group12" }, "lead": true }] }, { "position": "director", "department_positions": [], "group_positions": [] } ] const categories = { "position": ["lawyer", "director"], "group_positions": ["group1", "group12"], "department_positions": ["generalDep", "subDep"] } // convert the filterData to the objects and test them... let objects = filterData.map(d => new FilterMe(d)); let matches = objects.filter(o => o.matchesFilter(categories)) console.log(matches)