JavaScript项拼接自我不在列表中

问题描述:

如果我有一个对象数组有没有任何可能的方式将项目拼接出包含它的数组?JavaScript项拼接自我不在列表中

例如:如果一个坏人死了,他会拼出自己的阵营积极的敌人。

我可能听起来很疯狂,但这种能力将大大简化了我的代码,所以我希望的东西很酷=)

的方式,你会做如下: :

var game_state = { active_enemies: [] }; 
function Enemy() { 
    // Various enemy-specific things go here 
} 
Enemy.prototype.remove = function() { 
    // NOTE: indexOf is not supported in all browsers (IE < 8 most importantly) 
    // You will probably either want to use a shim like es5-shim.js 
    // or a utility belt like Underscore.js 
    var i = game_state.active_enemies.indexOf(this); 
    game_state.active_enemies.splice(i, 1); 
} 

参见:

Notta好处:有几个问题在这里与操控游戏状态的这种方式。确保你是一致的(即没有敌人从主动敌人列表中删除自己,但英雄从地图上移除敌人)。当代码变得更加复杂时,它也会让事情变得更加困难(你的敌人不仅是游戏中的敌人,而且是地图状态管理器,但它可能不是地图状态管理器。当你想要对你如何管理地图状态做出改变,你想确保代码的结构使你只需要在一个地方改变它[最好])。

你有种想避免循环引用

+2

作为一般的说法,我不同意。他们可以非常方便。你说这个的原因是什么(旧的JScript与DOM对象的错误在这种情况下不算作为一个有效的理由)? – davin

假设坏人知道他在什么名单,为什么不呢?

BadGuy.prototype.die = function() 
{ 
    activeEnemies.splice(activeEnemies.indexOf(this), 1); 
} 

顺便说一句,旧的浏览器使用indexOf阵列上,you'll need to add it manually

我会建议创建一个代表活动敌人列表的对象/类。在该实例上创建方法,以便从列表中添加/删除给定的项目 - 从外部世界中抽象出数据结构的内部运作。如果活动敌人列表是全局的(例如,只有其中一个),那么当你死的时候,你可以直接引用它来调用remove函数。如果它不是全局的,那么你必须给每个项目引用一个列表,以便它可以调用该函数来移除它自己。

你也可以使用一个对象,而不是拼接,删除敌人:

var activeEnemies = {}; 

function Enemy() { 
    this.id = Enemy.getId(); // function to return unique id 
    activeEnemies[this.id] = this; 
    // .... 
} 

Enemy.getId = (function() { 
    var count = 0; 
    return function() { 
    return 'enemyNumber' + count++; 
    } 
}()); 

Enemy.prototype.exterminate = function() { 
    // do tidy up 
    delete activeEnemies[this.id]; 
} 

Enemy.prototype.showId = function() { 
    console.log(this.id); 
} 

Enemy.prototype.showEnemies = function() { 
    var enemyList = []; 
    for (var enemy in activeEnemies) { 
    if (activeEnemies.hasOwnProperty(enemy)) { 
     enemyList.push(enemy); 
    } 
    } 
    return enemyList.join('\n'); 
} 

var e0 = new Enemy(); 
var e1 = new Enemy(); 

console.log(Enemy.prototype.showEnemies()); // enemyNumber0 
               // enemyNumber1 

e0.exterminate(); 

console.log(Enemy.prototype.showEnemies()); // enemyNumber1