Tengo un caso de uso en el que un usuario puede pasar cierta cantidad de variables en función de las cuales se realizará una lógica específica.
Como la combinación de variables difiere, trato de pensar en una forma elegante de codificar este proceso.
Por ejemplo, el usuario puede pasar name & type o email && schoolId && type otras combinaciones no son compatibles.
Estaba pensando en algo como esto:
const filterByX = (name && type); const filterByY = (email && schoolId && type); const decision = (filterByX ? 'filterX' : (filterByY ? 'filterY' : null )); switch(decision) { case 'filterX': ... break; case 'filterY': ... break; default: console.log('not supported') }Pero confío en que hay una forma más elegante de implementar esa lógica. Agradecería una sugerencia.
Una idea es un objeto codificado con la combinación bit a bit de variables. Por ejemplo, si a , b , c son los booleanos de entrada, cada combinación que le interese se puede codificar como un int 0-7.
const boolsToBits = (a,b,c) => { return a << 2 | b << 1 | c ; } console.log(boolsToBits(true, true, false)) // == 6 Con eso, puede switch el int resultante o (mejor, imo) describir funciones correspondientes a las condiciones usando datos, usando un objeto ingresado por los ints resultantes.
const actions = { 7: () => console.log('a, b and c are true'), 6: () => console.log('a, b are true'), 2: () => console.log('only b is true'), } const defaultAction = () => console.log('a combo not coded for explicitly') const boolsToBits = (a, b, c) => { return a << 2 | b << 1 | c; } const handleThreeBools = (a, b, c) => { const action = actions[boolsToBits(a, b, c)] || defaultAction; action(); } handleThreeBools(true, true, true); handleThreeBools(true, true, false); handleThreeBools(false, true, false); handleThreeBools(false, true, true);La idea se puede generalizar para un número arbitrario de bools como este...
const actions = { 7: () => console.log('a, b and c are true'), 6: () => console.log('a, b are true'), 2: () => console.log('only b is true'), 33: () => console.log('thats a lot of bits!') } const defaultAction = () => console.log('a combo not coded for explicitly') const boolsToBitsN = (...args) => { const length = args.length; let result = 0; for (let i = 0; i < length; i++) result |= args[i] << (length - 1 - i); return result } const handleNBools = (...args) => { const action = actions[boolsToBitsN(...args)] || defaultAction; action(); } handleNBools(true, false, false, false, false, true);Y, por supuesto, el objeto que contiene funciones codificadas por ints puede expandirse en consecuencia.