Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.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删除未删除所需的属性_Javascript_Node.js - Fatal编程技术网

Javascript删除未删除所需的属性

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

我正在使用nodejs创建一个游戏。碰巧这次我不能使用Delete。它不起作用,我不知道为什么

我执行这一行:

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
循环。

您应该阅读以下内容:.is
Bullet.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];