tengo ese objeto con dos listas dentro.
const list = { Operator: [ { Login: 'login1', PermissionGroup: '2', Sub: '3', }, { Login: 'login2', PermissionGroup: '3', Sub: '2', }, ], PermissionGroups: [ { PermissionGroupId: '2', GroupsName: 'Gestor', PermissionLevel: 2, }, { PermissionGroupId: '3', GroupsName: 'Lider', PermissionLevel: 3, }, ], };En mi redux, tengo el "Sub" de los Operadores. Entonces que tengo que hacer...
Paso 1: obtenga mi "sub" de Redux y encuentre en qué operador está
Paso 2: Ahora que tengo el Operador, necesito encontrar qué operador corresponde a PermissionGroup, usando PermissioninGroup (en Operadores) y PermissionGroupId (en PermissionGroups)
Este método hace lo que quiero (Ignorar el retorno final), ¿Cómo optimizo este método? No quería usar dos filtros para esto.
const search = (sub) => { const usuario = listaUsuarios.filter((element) => element.Sub === sub)[0]; const permissaoUsuario = listaPermissoes.filter( (element) => element.PermissionGroupId === usuario.PermissionGroup )[0]; return permissaoUsuario.PermissionLevel; };Personalmente, la solución actual parece estar bien (por supuesto, si se confirma que solo se requiere el elemento 0-th de .filter() , puede ser preferible usar .find() en su lugar). Dado que OP ha solicitado una alternativa, la solución a continuación (que no es mi recomendación) puede lograr el objetivo deseado.
Fragmento de código
const searchSub = (needle, {Operator, PermissionGroups}) => ( [...Operator, ...PermissionGroups].reduce( (res, obj) => ({ ...res, ...( 'Sub' in obj && obj.Sub === needle ? {foundSub: {...obj}} : 'PermissionGroup' in res.foundSub && 'PermissionGroupId' in obj && obj.PermissionGroupId === res.foundSub.PermissionGroup ? {matchedPermissionGroup: {...obj}} : {} ) }), {foundSub: {}, matchedPermissionGroup: {}} ) ); const list = { 'Operator': [{ 'Login': 'login1', 'PermissionGroup': '2', 'Sub': '3', }, { 'Login': 'login2', 'PermissionGroup': '3', 'Sub': '2', } ], 'PermissionGroups': [{ 'PermissionGroupId': '2', 'GroupsName': 'Gestor', 'PermissionLevel': 2, }, { 'PermissionGroupId': '3', 'GroupsName': 'Lider', 'PermissionLevel': 3, }, ] }; console.log(searchSub('2', list)) console.log( 'PermissionLevel: ', searchSub('2', list)?.matchedPermissionGroup.PermissionLevel );Explicación
... operador de extensión para construir una matriz con elementos de la matriz Operator y PermissionGroups.reduce() para iterar sobre esta matriz combinadaSub , rastrearlo en el objeto resPermissionGroupId coincidente, rastree eso tambiénres resultante tendrá elementos de la matriz Operator y PermissionGroups que coincidieron.NOTA
.find() separados en este contexto.