【发布时间】:2020-11-26 10:37:25
【问题描述】:
我正在尝试制作一个秘密圣诞老人,其中我有一个参与人员的列表,然后我只单击一次按钮,在每个名字前面我都会得到他们将要送礼物的人的名字。 要求是一个人没有得到自己的礼物,并且只送礼物一次。
我尝试在不创建新数组的情况下对数组进行洗牌,现在我正在尝试实现以下逻辑(最后的完整代码):
- 我有一个包含参与人员的数组:giveArr
- 我复制这个数组并将其命名为 toReceiveArr
- 通过循环,我通过 toReceiveArr 并从 中删除 personGiving
var toReceiveArr
var personGiving = toReceiveArr.splice(j,0);
- personReceiving 礼物是随机从 toReceiveArr 中取出的,并添加到第三个数组 - receivingArr - 其中人的名字是放置在与原始 giveArr 不同的位置,因此这是随机列表
var random = Math.floor(Math.random()*toReceiveArr.length);
var personReceiving = toReceiveArr[random];
receivingArr.push(personReceiving);
- 在此之后,我从 toReceiveArr 中删除接收礼物的人,并将赠送礼物的人添加回 toReceiveArr,以便可以将其包含在下一个 for 循环中并接收礼物
toReceiveArr.splice(random,1);
toReceiveArr.splice(j,0, personGiving);
所以最后我想要这样的东西:
giveArr = [杰森,迈克尔,苏珊]
接收Arr = [迈克尔,苏珊,杰森]
但是,当我尝试这样做时,我仍然会得到重复的捐赠者和收到自己礼物的人。我是初学者,但到目前为止,我对 HTML 部分或 EventListeners 没有任何问题。但是JS失败了。我的错误在哪里?
var give = document.getElementsByTagName("li");
var giveArr= [];
var toReceiveArr = [];
var receivingArr =[];
for (var i=0; i<give.length; i++){
giveArr.push(give[i].textContent); }
toReceiveArr = giveArr.concat();
for(var j=giveArr.length-1;j>=0;j--){
var personGiving = toReceiveArr.splice(j,0);
var random = Math.floor(Math.random()* toReceiveArr.length);
var personReceiving = toReceiveArr[random];
receivingArr.push(personReceiving);
toReceiveArr.splice(random,1);
toReceiveArr.splice(j,0, personGiving);
}
【问题讨论】:
标签: javascript arrays