javascript从数组中删除项目

时间:2011-05-27 09:10:08

标签: javascript arrays

我有“场景”图形“对象”......

Scene.prototype.objects=new Array();

Scene.prototype.add=function(obj){
  var last=this.objects.length;
  this.objects[last]=obj}

Scene.prototype.remove=function(obj){
  this.objects.splice(obj.id,1)}

Scene.prototype.advance=function(){
  for (var id in this.objects){
    var obj=this.objects[id];
    obj.id=id;
    obj.advance();
  }
}
Scene.prototype.paint=function(context){...}

每次创建和删除许多对象。 Array.prototype.splice重新索引数组吧?有没有人知道更好的技术(在javascript数组上添加和删除)?

在我看来,另一种可能性就是

Scene.prototype.remove=function(obj){
  delete this.objects[obj.id]; // don,t care about this.objects.length
  delete obj; // not necessary...
}

我还没试过......

我需要一本关于JavaScript的好书:)

3 个答案:

答案 0 :(得分:2)

您的删除方法无效,因为objects是一个数组,而obj.id是存储在该数组元素中的对象引用的ID。 splice将是使用的方法,但您必须知道Array中元素的索引。也许你应该这样'记住':

Scene.prototype.add=function(obj){
  var last=this.objects.length;
  obj.objectsIndex = last;
  this.objects[last]=obj
}

之后你可以:

Scene.prototype.remove=function(obj){
  this.objects.splice(obj.objectsIndex,1)};
  //reindex the objects within the objects Array
  for (var i=0; i<this.objects.length;i++){
     this.objects[i].objectsIndex = i;
  }
}

注意:将objects数组添加到Scene构造函数的原型中意味着它对所有实例(静态)都是相同的,这是你想要的吗?

答案 1 :(得分:0)

我宁愿避免使用new Array()而是使用[](我在评论中提到的书的第114页 - 道格拉斯克罗克福德的'JavaScript:The Good Parts'。)。

更重要的是,我不认为向Scene原型添加objects数组会像您期望的那样工作。您可能希望实现一些面向对象的结构,这需要JavaScript中的一些杂技技能,因为它使用prototypal inheritance,因为它是无类别的。

尝试这样的事情:

var Scene = function(initial_objects) {
    this.objects = initial_objects || [];
};

Scene.prototype.add = function(obj) {
    this.objects.push(obj);
};

Scene.prototype.remove_by_index = function(index) {
    this.objects.splice(index, 1);
};

Scene.prototype.remove = function(obj) {
    var index = this.objects.indexOf(obj);
    if (index > -1) {
        this.objects.splice(index, 1);
    }
};

另请阅读:http://javascript.crockford.com/inheritance.html

答案 2 :(得分:0)

您的对象实际上并不需要数组。您可以使用另一个具有哈希表的对象:

(function() {

    var i = 0;

    Scene.prototype.objects = {};

    Scene.prototype.add = function(obj) {
      var id = i++;
      this.objects[id] = obj;
      obj.id = id;
    };

    Scene.prototype.remove = function(obj){
      if(obj.id in this.objects) {
          delete this.objects[obj.id];
      }
    };

    Scene.prototype.advance=function(){
      for (var id in this.objects){
        var obj=this.objects[id];
        obj.id=id;
        obj.advance();
      }
    };

    Scene.prototype.paint=function(context){...}

}());