javascript项拼接自我列表

时间:2011-07-12 00:20:43

标签: javascript arrays

如果我有一个对象数组,那么该项目是否有可能将自己从包含它的数组中拼接出来?

例如:如果一个坏人死了,他会将自己从一群活跃的敌人中分离出来。

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

5 个答案:

答案 0 :(得分:14)

您的方式如下:

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 bene:这种处理游戏状态的方式存在一些问题。确保你一致(即没有敌人从活跃的敌人列表中移除自己,但英雄从地图中移除敌人)。随着代码变得越来越复杂,它也会让事情变得难以理解(你的敌人不仅是游戏中的敌人,还是地图状态管理者,但它可能不是唯一的地图状态管理器。当您想要更改管理地图状态的方式时,您希望确保代码的结构只需要在一个地方[最好]更改它。)

答案 1 :(得分:7)

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

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

顺便说一句,旧版浏览器在数组上使用indexOf you'll need to add it manually

答案 2 :(得分:0)

你想避免循环引用

答案 3 :(得分:0)

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

答案 4 :(得分:-1)

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

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