Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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 .forEach仅移动数组元素的一半_Javascript_Oop_Foreach - Fatal编程技术网

Javascript .forEach仅移动数组元素的一半

Javascript .forEach仅移动数组元素的一半,javascript,oop,foreach,Javascript,Oop,Foreach,首先,我是JavaScript新手,为了更好地理解OOP,我决定构建纸牌(三张牌版本)。在纸牌游戏中——我相信这是众所周知的——你以任何模式发牌,剩下的牌放在一边;我把这些叫做“预备队”甲板。然后你按照游戏规则移动你所发的牌(只能将红色6放在黑色7上,等等),当你没有选择时,你可以从“保留”牌顶部抽出三张牌,看看你是否可以使用第三张牌继续玩。如果没有,你再抽三张牌,以此类推,直到你的“储备”牌组中的牌用完。此时,您从“备用”牌组顶部取出的所有牌都可以放回“备用”牌组,然后以相同的方式重新使用 这

首先,我是JavaScript新手,为了更好地理解OOP,我决定构建纸牌(三张牌版本)。在纸牌游戏中——我相信这是众所周知的——你以任何模式发牌,剩下的牌放在一边;我把这些叫做“预备队”甲板。然后你按照游戏规则移动你所发的牌(只能将红色6放在黑色7上,等等),当你没有选择时,你可以从“保留”牌顶部抽出三张牌,看看你是否可以使用第三张牌继续玩。如果没有,你再抽三张牌,以此类推,直到你的“储备”牌组中的牌用完。此时,您从“备用”牌组顶部取出的所有牌都可以放回“备用”牌组,然后以相同的方式重新使用

这就是我的javascript崩溃的地方。因此,我创建了一个表对象,其属性为
playSlots
winSlots
reserve
pick
playSlots
是一个数组,其中牌被放入其中,
reserve
是“reserve”牌组中存在的牌的数组,
winSlots
与此问题无关,
pick
是一个数组,在整个游戏过程中,当需要时,它会填充
reserve
中的卡。非常不言自明
reserve
变为空时
您希望将
拾取的卡放回其中,我的代码当前为:

if(!Array.isArray(newGame.reserve) || !newGame.reserve.length){
  newGame.pick.forEach(function(cur, i, arr){
    newGame.reserve.push(arr.shift());
  });
}
这样做的问题是,这只会迭代
pick
数组中的一半卡片。我在调试器中查看了它,事实上,它是一次一张地将牌添加回备用牌组中,但一旦它到达第13张牌,它就会中断循环(28张牌以纸牌模式发放,剩余24张在备用牌组中…)

我很确定这个问题与
有关!newGame.reserve.length
条件。这种情况是我在这里发现的:

虽然答案呃在他对这一点的解释中非常清楚,但我还是有点模糊它的意思。事实上,我也试过这样做是为了一个条件:

if(newGame.reserve[0] === undefined)

结果完全一样。
.forEach
循环仅迭代了一半数组元素。。。。我在这里遗漏了什么?

您可以更轻松地使用

注意:这会将拾取反转到保留的末尾,而您的代码不会

如果不需要反转,只需移除
.reverse()

现在还不清楚你是否想保留

var newGame={
选择:[1,2,3,4],
储备:[10,11,12]
};
newGame.reserve.push(…newGame.pick.splice(0,newGame.pick.length.reverse());

console.log(新游戏)当在数组中循环时从数组中删除元素时,通常需要向后迭代以避免重新索引。请参阅此相关帖子:
console.log(arr)
在循环中,看看会发生什么……循环不只是试图实现
newGame.reserve.push(…newGame.pick.splice(0,newGame.pick.length))@TylerRoper好的,但这不会将元素反过来放入“reserve”数组吗?如果是这样的话,这在游戏的环境中是行不通的。。。如果这是唯一的方法,但。。。真的吗?你的代码并没有把它们倒过来,是吗?(提示:这不)太好了!!这很好用!不,我不需要它倒过来。从@TylerRoper的答案来看,我似乎需要这样做,因为代码从数组的末尾删除了项,因此“reserve”将以向后的方式结束,但这种方法不能做到这一点。非常感谢。旁注:人们需要跟上这
语法的发展速度,因为在学习javascript的两个月里,这是我第一次听说它。。显然,我自己也包括在内……我所说的人,是指提供javascript教程的youtuber以及W3学校!!w3schools是一个笑话——YouTuber的问题是那里有太多垃圾,很难找到真正的知识型垃圾:p