【问题标题】:javascript item splice self out of listjavascript项目拼接自我超出列表
【发布时间】:2011-07-12 00:20:42
【问题描述】:

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

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

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

【问题讨论】:

    标签: javascript arrays


    【解决方案1】:

    你会这样做的方式如下:

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

    【讨论】:

      【解决方案2】:

      假设坏人知道他在哪个列表中,为什么不呢?

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

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

      【讨论】:

        【解决方案3】:

        你有点想避免循环引用

        【讨论】:

        • 作为一般性声明,我不同意。它们可以非常方便。你有什么理由这么说(DOM 对象的旧 JScript 错误在这种情况下不算是正当理由)?
        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

          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
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-07-16
            • 2021-11-20
            • 1970-01-01
            • 1970-01-01
            • 2010-12-24
            • 2013-06-13
            • 2016-07-12
            相关资源
            最近更新 更多