Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/68.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 需要通过从另一个数组中随机选取18个数字并将这些数字在新数组中放置两次来构建新数组_Javascript_Jquery_Arrays - Fatal编程技术网

Javascript 需要通过从另一个数组中随机选取18个数字并将这些数字在新数组中放置两次来构建新数组

Javascript 需要通过从另一个数组中随机选取18个数字并将这些数字在新数组中放置两次来构建新数组,javascript,jquery,arrays,Javascript,Jquery,Arrays,我正在为JavaScript Jquery类中的一个组项目制作一个匹配游戏。我有36张图片,我可以用在瓷砖上。我希望游戏随机挑选其中18个,并将它们放入一个新阵列。我还需要在新阵列中使用这18个数字两次,因为新阵列将被洗牌,然后使用构建游戏板 这是我的密码: let objects = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19',

我正在为JavaScript Jquery类中的一个组项目制作一个匹配游戏。我有36张图片,我可以用在瓷砖上。我希望游戏随机挑选其中18个,并将它们放入一个新阵列。我还需要在新阵列中使用这18个数字两次,因为新阵列将被洗牌,然后使用构建游戏板

这是我的密码:

let objects = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29','30', '31', '32', '33', '34', '35', '36'],

function cardList () {
    var cardList = [36];
    for (i = 0; i < cardList.length; i+=2) {
        cardList[i] = objects[Math.floor(Math.round((Math.random()*36)+1))];
        cardList[i+1] = cardList[i];
    }
    return cardList;
}
让对象=['1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24','25','26','27','28','29','30','31','32','33','34','35','36'],
功能卡片列表(){
var cardList=[36];
对于(i=0;i
我试着用Chrome调试器处理这个问题,但这并不是创建所有的数字,它只是创建了两个初始数字


必须有更好的方法来做到这一点,我已经看了几个匹配游戏的示例,其中大多数都有确切的卡数需求,这可能会给我带来问题。

请参阅以下工作代码 我做了两个改变

1) 更改了行
var cardList=[36]
var卡片列表=数组(36)

2) 更改的
cardList[i]=objects[Math.floor(Math.round((Math.random()*36)+1))

let index = Math.floor((Math.random()*objects.length));
cardList[i] = objects[index];
为了避免重复,我添加了

objects.splice(index,1);
让对象=['1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24','25','26','27','28','29','30','31','32','33','34','35','36'];
功能卡片列表(){
var-cardList=数组(36);
对于(i=0;ilog(cardList())要选择数字,我只需将数组洗牌并从中提取18个唯一的元素。洗牌数组的最佳方法是Fisher-Yates洗牌,下面的洗牌实现取自。然后你需要做的就是“用自身连接数组”,你得到了一个起始数组,其中有18个数字,它们在数组中都存在两次。很明显,你可以直接洗牌得到的数组,瞧

让数组=['1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24','25','26','27','28','29','30','31','32','33','34','35','36'];
函数buildCardList(数组){
常量洗牌=洗牌(数组).slice(0,18);
返回洗牌(洗牌。康卡特(洗牌));
}
log(buildCardList(array));
//来源:https://stackoverflow.com/a/2450976/3993662
函数洗牌(数组){
var currentIndex=array.length,temporaryValue,randomIndex;
//虽然还有一些元素需要洗牌。。。
而(0!==currentIndex){
//选择剩余的元素。。。
randomIndex=Math.floor(Math.random()*currentIndex);
currentIndex-=1;
//并将其与当前元素交换。
临时值=数组[currentIndex];
数组[currentIndex]=数组[randomIndex];
数组[randomIndex]=临时值;
}
返回数组;
}
由于您(可能)不希望项目在结果中出现两次以上,因此应选择不替换的项目。我会这样做:

const objects=['1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24','25','26','27','28','29','30','31','32','33','34','35','36'];
常量getList=()=>{
const objs=objects.slice(0);
选定常数=[];
for(设i=0;i<18;i++){
const index=Math.floor(Math.random()*objs.length);
常量[num]=对象拼接(索引,1);
选中。推送(num,num);
}
返回选中的;
};

log(getList())
这有时包括重复项,也包括未定义项。
undefined
s。这其中充满了bug@Lisa请查看其他答案中的一个。undefined的问题已消除。OP访问索引的逻辑错误。现在已经解决了。避免重复的逻辑也被添加了。你这样做的方式,在getList前面加上“const”,意味着getList的数组将是一个常量,但是每次调用getList时生成的数字将不同,对吗?我真的很喜欢JavaScript,我想确保我理解我正在看的代码。Thanks@Lisa这只是定义函数的一种方式——在本例中,它与
函数getList(){
没有什么不同,它并不意味着返回值的任何内容。