Javascript删除未删除所需的属性
我正在使用nodejs创建一个游戏。碰巧这次我不能使用Delete。它不起作用,我不知道为什么 我执行这一行:Javascript删除未删除所需的属性,javascript,node.js,Javascript,Node.js,我正在使用nodejs创建一个游戏。碰巧这次我不能使用Delete。它不起作用,我不知道为什么 我执行这一行: delete Bullet.list[i] 而Bullet.list是一个具有属性的对象,执行此行后,所需的属性不会被删除 这是我的代码(您可以在下面的上下文中看到上面的代码行): var-Map=require(“./Map.js”) var Player=require(“./Player.js”); var Bullet=require(“./Bullet.js”); var
delete Bullet.list[i]
而Bullet.list
是一个具有属性的对象,执行此行后,所需的属性不会被删除
这是我的代码(您可以在下面的上下文中看到上面的代码行):
var-Map=require(“./Map.js”)
var Player=require(“./Player.js”);
var Bullet=require(“./Bullet.js”);
var Fly=require(“./Fly.js”);
var Settings=require(“./Settings.js”);
var模拟=函数(套接字列表){
//更新项目符号
for(Bullet.list中的变量i){
var bullet=bullet.list[i];
bullet.update();
var shooter=Player.list[bullet.parent];
//子弹与苍蝇相撞
for(Fly.list中的变量i){
var fly=fly.list[i];
如果(!bullet.toRemove&&bullet.getDistance(fly)<15){
if(射手){
射手。更新币(飞行。杀手币);
shooter.updateXp(fly.killXp);
}
bullet.toRemove=true;
fly.toRemove=true;
}
}
//与玩家碰撞
for(Player.list中的变量i){
var player=player.list[i];
如果(玩家死亡)继续;
如果(!bullet.toRemove&&bullet.getDistance(player)<32&&shooter!==player.id&&shooter.team!=player.team&&player.immune){
player.hp-=1;
player.hpChanged=true;
如果(player.hp在删除数组元素时,数组长度不受影响。即使删除了数组的最后一个元素,该值仍然有效
您可以尝试Bullet.list.splice(i,1)
作为delete
的替代方法
这段代码中有很多内容,希望能有所帮助!您的三个for
循环都共享同一个变量i
,因此您不会删除您想要删除的i
索引。这是因为var i
是函数作用域,而不是单个for
循环的作用域
执行此操作时:
delete Bullet.list[i];
i
的值是在上一个for
循环之后的i
值,可能不是您实际想要删除的项目。也许您的意思是打破之前的for
循环,以便i
将是您想要删除的特定项目
或者,您需要将要删除的项的索引单独保存到另一个变量。或者,当i
的值为当前值时,只需删除for
循环中的项即可
请记住,var
是函数作用域。因此,两个嵌套的for
循环中的var i
声明实际上引用了完全相同的变量,而不是声明新的变量。我建议将两个循环之一中的循环索引名称更改为单独的变量
如果您在完全支持let
的环境中运行,您可以使用let i
而不是var i
,然后i
的值将被唯一地限定为声明它的for
循环。您应该阅读以下内容:.isBullet.list
数组或对象?TJavascript中delete
的主要目的是删除对象的属性(而不是从数组中删除元素)。@jfriend00 Bullet.list是一个对象,其中键是Bullet.id。我可以访问这样的项目符号:var Bullet=Bullet.list[Bullet.id].bullet.id是一个随机数,而不是数组索引。@vol7ron如果我试图使用delete,那是因为bullet.list是一个对象。我没有提及,因为我认为它很明显……我也在使用for(bullet.list中的var I),所以…@jfriend00问题陈述是“它不工作,我不知道为什么……我无法删除属性”I“从对象Bullet.list.”和代码转储。这还不够具体。您能够为OP调试代码很好,但这对以后的任何人都没有帮助。@GeorgeStocker-结束一个其他人理解的问题有什么用?问题的最后一行是我无法删除属性”i“从对象Bullet.list.
。当您在代码中查找delete
,您会看到这一行delete Bullet.list[i];/*问题就在这里。属性没有被删除*/
。信息就在那里。没有我们想要的那么清楚,但是信息是给仔细的读者的。没有理由关闭一个仔细的读者完全理解的问题。Bullet.list不是数组。它是一个对象,其中键是每个项目符号的id。对不起!我以为我t是一个名为list
的数组。试图在没有全部上下文的情况下回答这个问题。你确定吗?当我写这段代码时,我认为“I”是对var“I”的引用"在outter for循环中。@DanielOliveira-不。var
是函数作用域。因此,两个var i
声明实际上都引用同一个变量。如果您使用let
而不是var
,那么您所想的情况可能会起作用。但是,在我的书中,您不应该对nest使用相同的变量ed循环。这是正确的答案。问题是变量作用域的结果。
delete Bullet.list[i];