Tengo varias funciones y condiciones de javascript. Cada una de las funciones se puede ejecutar solo si las condiciones son verdaderas. Es posible que dos funciones cumplan con las condiciones y, si esto sucede, quiero elegir aleatoriamente una función para ejecutar.
por ejemplo:
foo se ejecutará solo si cond1 es verdadero goo se ejecutará solo si cond2 es verdadero hoo se ejecutará solo si cond3 es verdadero
digamos que cond1=verdadero, cond2=falso cond3=verdadero. Quiero elegir aleatoriamente entre foo y hoo.
¿Cuál es la mejor manera de implementar eso?
No creo que haya una razón para ponerse elegante aquí. Solo use algunos if s para verificar sus condiciones. Si se aplica una condición, empuje la función correspondiente a una matriz de options posibles. Luego seleccione un valor aleatorio en la matriz y llámelo.
const foo = () => console.log("foo"); const goo = () => console.log("goo"); const hoo = () => console.log("hoo"); const cond1 = true; const cond2 = false; const cond3 = true; const options = []; if (cond1) options.push(foo); if (cond2) options.push(goo); if (cond3) options.push(hoo); options[Math.floor(Math.random() * options.length)]();Y para los amigos de la taquigrafía:
const foo = () => console.log("foo"), goo = () => console.log("goo"), hoo = () => console.log("hoo"), cond1 = true, cond2 = false, cond3 = true, options = [ ...(cond1 ? [foo] : []), ...(cond2 ? [goo] : []), ...(cond3 ? [hoo] : []), ]; options[Math.floor(Math.random() * options.length)]();Una buena estructura de datos para el trabajo sería una lista de pares [condition, function] donde la condition también es una función. Para ejecutar una función específica, primero filtra la lista ejecutando condiciones y elige un elemento aleatorio de lo que queda:
funcs = [ [ () => x > 10, () => console.log('one'), ], [ () => x > 20, () => console.log('two'), ], [ () => x > 30, () => console.log('three'), ], ] let randomItem = a => a[Math.floor(Math.random() * a.length)] x = 35 // @TODO handle the edge case when no function matches let pair = randomItem(funcs.filter(p => p[0]())) pair[1]()"eval" es una buena ayuda para esta suposición;
Por ejemplo, tenemos 5 funciones y el nombre es "f1, f2, f3, f4, f5" y las condiciones son valores booleanos c1, c2, c3, c4, c5
si es aleatorio, seleccione condiciones de suma para probar el programa;
function f1() { console.log("f1 fired!"); } function f2() { console.log("f2 fired!"); } function f3() { console.log("f3 fired!"); } function f4() { console.log("f4 fired!"); } function f5() { console.log("f5 fired!"); } var c1 = false; var c2 = true; var c3 = false; var c4 = true; var c5 = false; var selectedFunctionNames = []; function test(){ if(c1) selectedFunctionNames.push("f1()"); if(c2) selectedFunctionNames.push("f2()"); if(c3) selectedFunctionNames.push("f3()"); if(c4) selectedFunctionNames.push("f4()"); if(c5) selectedFunctionNames.push("f5()"); if(selectedFunctionNames.length>=1) eval(selectedFunctionNames[Math.floor(Math.random() * selectedFunctionNames.length)]); else console.log("There is no any function have a condition"); } <button onclick="test()">Test me</button> <label>Result in the console</label>