使用相同的参数JavaScript多次调用一个函数

时间:2018-09-25 16:55:01

标签: javascript

我正在编写一个“秘密圣诞老人”函数,该函数接受一个名称数组,并将它们与同一数组中的其他名称随机匹配(并且它们自身不能匹配)。

我已经开始工作了,但是现在我需要使它运行两次,以确保该函数运行两次,然后确保没有人连续两年遇到同一个人。为了我自己的生命,我无法让函数运行两次并创建两个单独的输出(console.log除外,但由于我需要比较对我无用的输出进行比较)。

代码:

var family = ['aaa', 'bbb', 'ccc', 'ddd', 'eee', 'fff', 'ggg', 'hhh', 'iii']

function secretSanta() {
var yourPick = [];
var receivers = family.slice();
var length = family.length;
for (var i = 0; i < length; i++) {
  var giver = family[i];
  var receiverIndex = Math.floor(Math.random() * receivers.length);
     while (receivers[receiverIndex] === giver) {

       receiverIndex = Math.floor(Math.random() * receivers.length);
     }
     var receiver = receivers.splice(receiverIndex, 1)[0];
    yourPick.push({
      Giver: giver,
      Receiver: receiver
    });
}
return yourPick;
}
secretSanta()

我尝试过迭代

for (var i = 1; i < 3; i++) secretSanta(i)

递归

(function repeat(number) {
    secretSanta(number);
    if (number < 3) repeat(number + 1);
})(1);

和函子应用程序

[1, 2, 3].forEach(secretSanta);

但是我要么无法定义,无限循环,要么“超出最大堆栈大小”

感谢大家的帮助!

1 个答案:

答案 0 :(得分:0)

所有可能的不同对,以随机顺序排列。

var family = ['aaa', 'bbb', 'ccc', 'ddd', 'eee', 'fff', 'ggg', 'hhh', 'iii']


var pairs = [];

for(let i = 0; i<family.length; i++){
    for(let j = i+1; j<family.length; j++){
    pairs.push([family[i], family[j]])
    }    
}

while(pairs.length){
    let pair = Math.floor(Math.random() * pairs.length)
    let temp = pairs.splice(pair,1);
    if(Math.floor(Math.random()*2)) temp[0].reverse()//<-- pair order
    console.log(temp[0].join(" - "))
}

一会儿只是随机挑选一对。