【问题标题】:choose random function according to condition根据条件选择随机函数
【发布时间】:2021-08-11 18:04:57
【问题描述】:

我有几个 javascript 函数和条件。每一个功能只有在条件成立时才能被执行。 有可能两个函数都满足条件,如果发生这种情况,我想随机选择一个函数来执行。

例如:

foo 将仅在 cond1 为真时执行 只有当 cond2 为真时 goo 才会执行 hoo 仅当 cond3 为真时才会执行

假设 cond1=true,cond 2=false cond3=true。 我想在 foo 和 hoo 之间随机选择。

实现它的最佳方法是什么?

【问题讨论】:

  • 将所有适用的函数放在一个数组中并从该数组中随机选择一个。

标签: javascript random


【解决方案1】:

我认为没有理由在这里花哨。只需使用一些ifs 来检查您的情况。如果条件适用,则将相应的函数推送到可能的options 数组中。然后在数组中选择一个随机值并调用它。

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)]();

对于速记的朋友:

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)]();

【讨论】:

  • 漂亮而简单。如果条件数量变大,@georg 的解决方案可能更合适。
  • 完全同意。
【解决方案2】:

适合这项工作的一个好的数据结构是[condition, function] 对的列表,其中condition 也是一个函数。要运行特定的函数,您首先通过运行条件过滤列表,然后从剩余的内容中选择一个随机项:

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]()

【讨论】:

  • 我喜欢这个方法!
【解决方案3】:

“eval”是这个问题的好帮手;

例如我们有 5 个函数,命名为“f1, f2, f3, f4, f5”,条件是布尔值 c1, c2, c3, c4, c5

如果对测试程序进行随机选择和条件;

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>

【讨论】:

  • 没有理由使用eval(),因为您可以将函数引用放入数组中。
  • 为什么 eval 可以向数组中添加函数? JavaScript 中的函数就像数字一样是一等公民。
  • 你是对的,但还有这样的替代方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多