【问题标题】:.forEach only moving half of array elements.forEach 只移动数组元素的一半
【发布时间】:2018-07-14 02:41:05
【问题描述】:

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

这就是我的 javascript 崩溃的地方。所以我创建了一个具有属性playSlotswinSlotsreservepick 的表对象。 playSlots 是发牌的数组数组,reserve 是存在于“保留”牌组中的牌数组,winSlots 与此问题无关,pick 是一个数组在整个游戏过程中都需要使用来自reserve 的卡片。不言自明。 reserve 变为空时并且您想将pick 卡片放回其中,我目前的代码是:

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 条件有关。这种情况是我在这里找到的:

Check if array is empty / does not exist. JS

虽然回答者对此的解释非常清楚,但我仍然对它的含义有些模糊。问题是,我也尝试过这个条件:

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

并得到完全相同的结果。 .forEach 循环只迭代了一半以上的数组元素....我在这里缺少什么?

【问题讨论】:

  • 在循环遍历数组时从数组中删除元素时,您通常需要向后迭代以避免重新索引。请参阅此相关帖子:Looping through array and removing items, without breaking for loop
  • console.log(arr) 在循环内看看会发生什么......
  • 不是循环只是试图实现newGame.reserve.push(...newGame.pick.splice(0, newGame.pick.length));
  • @TylerRoper 好的,但这不会将元素放入“保留”数组中吗?如果是这样,那在游戏的上下文中就行不通了……我想如果这是唯一的方法,那就有 .reverse() 方法,但是……真的吗?
  • 你的代码并没有把它们倒过来,是吗? (提示:它没有)

标签: javascript oop foreach


【解决方案1】:

您可以使用Array splice 更轻松地实现这一目标

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

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

不清楚你是否想把选秀权反转为预备队

var newGame = {
    pick: [1,2,3,4],
    reserve: [10,11,12]
};

newGame.reserve.push(...newGame.pick.splice(0, newGame.pick.length).reverse());
console.log(newGame);

在“老派”javascript中,可以使用.push.apply编写

var newGame = {
    pick: [1,2,3,4],
    reserve: [10,11,12]
};
newGame.reserve.push.apply(newGame.reserve, newGame.pick.splice(0, newGame.pick.length).reverse());
console.log(newGame);

【讨论】:

  • 很好!!这完美!不,我不需要它反转。查看@TylerRoper 的答案,我似乎需要这样做,因为该代码从数组末尾删除了项目,因此“保留”最终会倒退,但这种方法不会这样做。谢谢!!旁注:人们需要跟上这种... 语法的速度,因为在学习 javascript 的两个月中,这是我第一次听说它......显然包括我自己......
  • 对于人来说,我的意思是 youtuber,他们提供有关 javascript 和 W3Schools 的教程!!
  • w3schools 是个笑话 - youtube 用户的问题是那里的垃圾太多了,很难找到真正的知识渊博的:p
猜你喜欢
  • 2018-09-10
  • 1970-01-01
  • 2012-04-10
  • 1970-01-01
  • 2020-04-24
  • 1970-01-01
  • 2017-03-13
  • 2013-02-27
相关资源
最近更新 更多