Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/428.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将数组项连接到唯一关系(JS)_Javascript - Fatal编程技术网

Javascript 将数组项连接到唯一关系(JS)

Javascript 将数组项连接到唯一关系(JS),javascript,Javascript,我有一个字符串数组 let people = ['Bill', 'Paul', 'William', 'Francis']; 我想创建随机对: 比尔->保罗 保罗->弗朗西斯 威廉->比尔 弗朗西斯->威廉 所有对必须是唯一的,第二列中的每个名称只能使用一次 这是我的代码,但它没有按预期工作 let receivers = people.sort(function() { return 0.5 - Math.random() }); for (let i in people) {

我有一个字符串数组

let people = ['Bill', 'Paul', 'William', 'Francis'];
我想创建随机对:

比尔->保罗

保罗->弗朗西斯

威廉->比尔

弗朗西斯->威廉

所有对必须是唯一的,第二列中的每个名称只能使用一次

这是我的代码,但它没有按预期工作

let receivers = people.sort(function() { return 0.5 - Math.random() });

for (let i in people) 
{  
    console.log(people[i] +' -> '+ receivers[i]);
}

有什么建议吗?

取决于你想完成什么。如果您所关心的只是将
人员
随机匹配到
接收者
,那么您可以执行以下操作:

for(让我进入接收者){console.log(people[Math.Random()]+'->'+接收者[i]);}

并确保随机值小于数组的大小


但是,如果您想确保people中的每个人都被使用,这是一种糟糕的方法。

问题在于
sort
返回原始(但经过修改)数组,而不是新数组

无论如何,您不应该使用
排序
来洗牌。这太贵了,而且有失偏颇

您需要一个适当的洗牌实现,然后使用以下方法之一:

let receivers=shuffleInPlace(people.slice());
let receivers=shuffleToNewArray(人);
然后您将能够编写映射:


for(让i=0;i老实说,最简单的解决方案是将数组随机化,然后在其中循环,使每个人成为下一个人的给予者

首先,我们将使用以下技术洗牌阵列:

shuffle(人);
for(设i=0;i${receiver}`);
}

(我假设您很乐意使用ES6,因为您已经使用了
let

从中获取随机数组,并将其与下一个元素进行比较,就像一个圆一样

函数洗牌(数组){
var currentIndex=array.length,temporaryValue,randomIndex;
//虽然还有一些元素需要洗牌。。。
而(0!==currentIndex){
//选择剩余的元素。。。
randomIndex=Math.floor(Math.random()*currentIndex);
currentIndex-=1;
//并将其与当前元素交换。
临时值=数组[currentIndex];
数组[currentIndex]=数组[randomIndex];
数组[randomIndex]=临时值;
}
返回数组;
}
让人们=[‘比尔’、‘保罗’、‘威廉’、‘弗朗西斯’];
洗牌(人);

对于(var i=0;它是鲜为人知的秘密圣诞老人算法?我不知道它有一个名字…谢谢你的建议。永远不要使用
0.5-Math.random()
来洗牌数组!!!请参阅
shuffle(people);

for (let i = 0; i < people.length; i++) {
    let giver = people[i],
        receiver;

    if (people[i+1]) {
        receiver = people[i+1]
    } else {
        receiver = people[0]
    }

    console.log(`${giver} => ${receiver}`);
}