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