Javascript删除不会删除所需的属性

时间:2016-08-30 01:20:28

标签: javascript node.js

我正在使用nodejs来创建游戏。碰巧这次我无法使用删除。它不起作用,我不明白为什么。

我执行此行:

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 Simulation = function(SOCKET_LIST){ 

//Update Bullets
for(var i in Bullet.list){
    var bullet = Bullet.list[i];
    bullet.update();

    var shooter = Player.list[bullet.parent];       
    //Bullets collide with flies
    for(var i in Fly.list){
        var fly = Fly.list[i];
        if(!bullet.toRemove && bullet.getDistance(fly) < 15){
            if(shooter){
                shooter.updateCoins(fly.killCoins);
                shooter.updateXp(fly.killXp);
            }
            bullet.toRemove = true;
            fly.toRemove = true;
        }
    }
    //Collide with player
    for(var i in Player.list){
        var player = Player.list[i];
        if(player.death) continue;
        if(!bullet.toRemove && bullet.getDistance(player) < 32 && shooter !== player.id && shooter.team != player.team && !player.immune){
            player.hp -= 1;
            player.hpChanged = true;
            if(player.hp <= 0){
                if(shooter)
                    player.kill(shooter);
                else
                    player.kill();
            }
            bullet.toRemove = true;
        }
    }
    //Collide with map
    if(typeof shooter == "undefined" || shooter.shootsCollideMap && Map.isColliding(bullet))
        bullet.toRemove = true;

    //Remove bullets
    if(bullet.toRemove){
        delete Bullet.list[i]; /*HERE IS THE PROBLEM. THE PROPERTY IS NOT BEING DELETED*/
        Bullet.removePack.push[bullet.id];
    }

}

我无法从对象Bullet.list中删除属性“i”。

2 个答案:

答案 0 :(得分:2)

您的三个for循环都共享相同的变量i,因此您不会删除您想要的i索引。这是因为var i是函数作用域,而不是作用于单个for循环。

执行此操作时:

delete Bullet.list[i];

i的值是i在您之前的for循环之后的任何内容,可能不是您实际要删除的项目。也许您的意思是先退出for循环,以便i成为您要删除的特定项目?

或者您需要单独将另一个变量保存为要删除的项目的索引。或者,当for的值为最新值时,只需删除i循环中的项目。

请记住var是功能范围的。因此,两个嵌套var i循环中的for声明实际上都是引用完全相同的变量,而不是声明一个新变量。我建议将两个循环中的一个循环索引的名称更改为单独的变量。

如果您在完全支持let的环境中运行,则可以使用let i代替var i,然后将i的值唯一作用于只有声明它的for循环。

答案 1 :(得分:-1)

删除数组元素时,数组长度不受影响。即使您删除了数组的最后一个元素,这也成立。

您可以尝试使用Bullet.list.splice(i, 1)作为delete的替代方案。

此代码中有很多内容,希望这有帮助!