Tengo que crear una matriz con muchas condiciones. pero cuando trato de leer lo que escribí es muy complicado saber lo que estoy tratando de hacer. así que trato de simplificar a estas condiciones, pero no se me ocurre nada. las ubicaciones también son importantes. ¿Cómo puedo simplificar este bloque de código?
const createArrayByConditions = (condition1, condition2, condition3, condition4) => { if (condition1) { if (condition4) { return [ 1, 4, 999, ]; } else { return [1, 999]; } } if (condition2) { if (condition4) { return [ 2, 4, 999, ]; } return [2, 999]; } if (condition3) { if (condition4) { return [ 3, 4, 999, ]; } else { return [3, 999]; } } if (condition4) { return [4, 999]; } else { return [999]; } };Me viene a la mente una solución bastante limpia. Parece que la matriz de retorno siempre contiene 999 , por lo que comenzamos con una matriz con solo ese valor. 4 también se incluye siempre que condition4 sea veraz. Por último, debemos agregar el prefijo 1 , 2 o 3 , en función de qué conditionN se evalúe primero como un valor verdadero.
function createArrayByConditions( condition1, condition2, condition3, condition4 ) { const array = [999]; if (condition4) array.unshift(4); if (condition1) array.unshift(1); else if (condition2) array.unshift(2); else if (condition3) array.unshift(3); return array; }En general, parece que no hay nada que simplificar. Tienes tus condiciones y la complejidad está ahí. Si no puede hacer más suposiciones sobre los valores devueltos (son ejemplos, supongo), entonces está bien con lo que tiene.
Personalmente, prefiero los operadores ternarios si cada ruta condicional finalmente devuelve un valor del mismo tipo. Pero sé que fácilmente puedes pegarte un tiro en el pie con ellos. Sin embargo, puede decidir sobre la legibilidad:
const createArrayByConditions = (c1, c2, c3, c4) => c1 ? (c4 ? [1, 4, 999] : [1, 999]) : c2 ? (c4 ? [2, 4, 999] : [2, 999]) : c3 ? (c4 ? [3, 4, 999] : [3, 999]) : (c4 ? [4, 999] : [999]);Esto es lo máximo que pude simplificar las condiciones al hacer un bucle de los argumentos pasados como una matriz:
const createArrayByConditions = (conditions) => { for(let i=0;i<3;i++){ if ( conditions[i] && conditions[3] ){ return [i+1, 4, 999] } else if( conditions[i] ){ return [i+1, 999]; } } if(conditions[3]) return [4, 999]; else return [999]; }; //1-4 console.log( createArrayByConditions([true, false, false, false]) ); //-> [1,999] console.log( createArrayByConditions([true, false, false, true]) ); //-> [1,4,999] //2-4 console.log( createArrayByConditions([false, true, false, false]) ); //-> [2,999] console.log( createArrayByConditions([false, true, false, true]) ); //-> [2,4,999] //3-4 console.log( createArrayByConditions([false, false, true, false]) ); //-> [3,999] console.log( createArrayByConditions([false, false, true, true]) ); //-> [3,4,999] //4 console.log( createArrayByConditions([false, false, false, true]) ); //-> [4,999] console.log( createArrayByConditions([false, false, false, false]) ); //-> [999]