Digamos que tengo unas 6 condiciones (af) y si las declaraciones se enumeran a continuación. Como puede ver, hay un patrón para estas declaraciones if. Cada próxima declaración if tiene casi las mismas condiciones que la anterior, pero la primera condición que se usó anteriormente se elimina.
if(a && b && c && d && e && f) return 5; if(b && c && d && e && f) return 4; if(c && d && e && f) return 3; if(d && e && f) return 2; if(e && f) return 1; if (f) return 0; return -1;
Creo que no hay necesidad de tener tantas condiciones elaboradas, especialmente porque hay casos que introducen algunas comprobaciones de condiciones redundantes y preferiría evitar eso. Intenté reescribirlo, pero solo encontré algo como esto:
let res = -1; if(f) { res = 0; if(e) { res = 1; if(d) { res = 2; if(c) { res = 3; } if(b) { res = 4; if(a) { res = 5; } } } } } return res;
De esta manera, ya no tengo verificaciones de condición redundantes, pero esta solución aún parece demasiado complicada. ¿Hay algunas formas inteligentes de reescribirlo para que pueda tener una solución simple sin controles redundantes?
Sus declaraciones if
anidadas no son tan malas: eliminan la duplicación de manera bastante eficiente y crean una estructura lineal. Puede acortar aún más el código usando un bucle:
let res = -1; for (const flag of [f, e, d, c, b, a]) { if (flag) res++; else break; } return res;
Esto aún evalúa todas las condiciones por adelantado, por lo que si es costoso calcularlas, es posible que desee utilizar funciones que pueda evaluar cuando sea necesario:
let res = -1; for (const getFlag of [()=>f, ()=>e, ()=>d, ()=>c, ()=>b, ()=>a]) { if (getFlag()) res++; else break; } return res;
Si las condiciones son baratas, y también sabe que si una es falsa, todas las demás también son falsas, ni siquiera necesita break
el ciclo. Luego se puede simplificar en una sola expresión:
return -1 + f + e + d + c + b + a;
Coloque las condiciones en una matriz, junto con los resultados.
const conds = [[a, 5], [b, 4], [c, 3], [d, 2], [e, 1], [f, 0]]; while (conds.length) { if (conds.every(([cond]) => cond)) { return conds[1]; } conds.shift(); } return -1;