gpt4 book ai didi

JavaScript——试图使用循环删除数组中的某些项目,但它删除了所有项目

转载 作者:行者123 更新时间:2023-11-30 08:52:29 25 4
gpt4 key购买 nike

我首先尝试使用 forEach 循环从数组中删除项目,但后来了解到您不应该这样做。所以我试着用一个普通的 for 循环来做一个。这是循环遍历一个包含子弹的数组,当它们离开游戏区域时将其删除。

for (i = 0; i < playerBullets.length; i++) {
console.log(playerBullets[i].x);
console.log(playerBullets[i]);
if (playerBullets[i].x > 800 || playerBullets[i].x < 0 || playerBullets[i].y > 600 || playerBullets[i].y < 0 ) {
playerBullets.splice(i);
}
}

控制台正确地完整显示 [i],并显示数组所有内容的列表。然而,[i].x 控制台日志只显示一个值,而不是数组中每个对象的“x”值。

然后,一旦第一颗子弹出界,所有子弹就会消失。最令人沮丧的是,杀死僵尸非常无效。

我也尝试过循环向后循环,这似乎是推荐的方式,但它告诉我 i 是未定义的。

有什么想法吗?我觉得我犯了一个非常简单的错误,因为我使用的结构与教程网站上的代码相同,所以它“应该可以工作”。

谢谢!

最佳答案

您应该将两个参数传递给 .splice() method ,开始索引(你正在做的)和要删除的元素的数量(你没有做的):

playerBullets.splice(i, 1);

向后循环是一个好主意的原因是,如果您在循环遍历数组时从数组中间删除一个项目,那么您的索引 i 将不同步 - 每个元素的索引删除后的项目减少 1,因此在使用 i++ 进行下一次循环迭代时,您将跳过删除后的元素。如果向前循环,您需要在删除项目后将 i 减 1。如果向后循环,这不是问题。

我猜你在尝试向后循环时得到了 undefined,因为你从 playerBullets.length 开始,它比最后一个项目的索引多 1。您需要从 playerBullets.length - 1 开始,向下到 0:

for (i = playerBullets.length - 1; i >= 0; i--) {
if (playerBullets[i].x > 800 || playerBullets[i].x < 0 || playerBullets[i].y > 600 || playerBullets[i].y < 0 ) {
playerBullets.splice(i, 1);
}
}

关于JavaScript——试图使用循环删除数组中的某些项目,但它删除了所有项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16629073/

25 4 0
文章推荐: sql-server - 使用 ACL 授予 Azure 机器学习对虚拟机上 SQL Server 的访问权限
文章推荐: java - 更改 DESFire 主 key 时出现 0x1E 错误 (INTEGRITY_ERROR)。我的错误是什么?我该如何解决?
文章推荐: machine-learning - Scikit 学习支持向量机的多类分类
文章推荐: javascript - 未捕获的类型错误 : Object # has no method 'transitionTo'