Javascript 删除数组的对象而不循环所有数组

Javascript 删除数组的对象而不循环所有数组,javascript,Javascript,我希望能够在不循环所有对象数组的情况下从数组中删除对象,以查看当前数组元素是否具有我要删除的项的ID javascript: function CBooks() { this.BooksArray = []; this.AddBook = function(divID, sContents) { this.BooksArray.push(new CBook()); pos = this.BooksArray.length - 1;

我希望能够在不循环所有对象数组的情况下从数组中删除对象,以查看当前数组元素是否具有我要删除的项的ID

javascript:

function CBooks() {
    this.BooksArray = [];

    this.AddBook = function(divID, sContents) {
        this.BooksArray.push(new CBook());
        pos = this.BooksArray.length - 1;
        this.BooksArray[pos].ArrayID = pos;
        this.BooksArray[pos].DivID = divID;
        this.BooksArray[pos].Contents = sContents;
    }

    this.DelBook = function(divID) {
        this.BooksArray.splice(...);
    }
}

function CBook() {
    this.ArrayID = 0;
    this.DivID = "";
    this.Contents = "";
}
我按如下方式初始化对象:

var oBooks = new CBooks();
function CBooks() {
    this.BooksArray = [];
    this.Hashes = {};

    this.AddBook = function(divID, sContents) {
        this.BooksArray.push(new CBook());
        pos = this.BooksArray.length - 1;
        this.BooksArray[pos].ArrayID = pos;
        this.Hashes[divID] = pos;
        this.BooksArray[pos].DivID = divID;
        this.BooksArray[pos].Contents = sContents;
    }

    this.DelBook = function(divID) {
        this.BooksArray.splice(this.Hashes[divID], 1);
    }
}

function CBook() {
    this.ArrayID = 0;
    this.DivID = "";
    this.Contents = "";
}
我添加了一本新书,如下所示:

oBooks.AddBook("divBook1", "blahblahblah");
//Creation of the div here
oBooks.AddBook("divBook2", "blehblehbleh");
//Creation of the div here
现在,用户可以单击显示每本书的div中的X按钮,以便删除该书。因此,X按钮包含:

onclick=oBooks.DelBook(this.id);
现在很明显,在DelBook(divID)函数中,我可以循环遍历BooksArray的长度,并查看每个元素的divID是否等于该点的参数和拼接,但我希望避免循环

有什么办法吗


提前感谢

类似的方法会奏效,但前提是您愿意放弃用于散列的数组

您的代码已编辑

function CBooks() {
  this.BooksHash = {};

  this.AddBook = function(divID, sContents) {
    var book = new CBook();
    //book.ArrayID = pos; //you don't actually need this anymore using a hash
    book.DivID = divID;
    book.Contents = sContents;
    this.BooksHash[book.DivID] = book;
  }

  this.DelBook = function(divID) {
    delete this.BooksHash[divID];
  }
}

function CBook() {
  //this.ArrayID = 0; // same here
  this.DivID = "";
  this.Contents = "";
}

希望它能有所帮助,但前提是您愿意放弃用于散列的数组

arr.filter(function(item){
  Return item.id != idtoremove
 });
您的代码已编辑

function CBooks() {
  this.BooksHash = {};

  this.AddBook = function(divID, sContents) {
    var book = new CBook();
    //book.ArrayID = pos; //you don't actually need this anymore using a hash
    book.DivID = divID;
    book.Contents = sContents;
    this.BooksHash[book.DivID] = book;
  }

  this.DelBook = function(divID) {
    delete this.BooksHash[divID];
  }
}

function CBook() {
  //this.ArrayID = 0; // same here
  this.DivID = "";
  this.Contents = "";
}
希望能有帮助

arr.filter(function(item){
  Return item.id != idtoremove
 });
这将在封面下循环,但使用快速的本机代码,更易于阅读。如果您真的想要O(1)delete,那么您需要使用某种散列,并在创建和更新数组时增加额外的开销

这将在封面下循环,但使用快速的本机代码,更易于阅读。如果您真的想要O(1)delete,则需要使用某种散列,并在创建和更新数组时增加额外的开销

var oBooks = new CBooks();
function CBooks() {
    this.BooksArray = [];
    this.Hashes = {};

    this.AddBook = function(divID, sContents) {
        this.BooksArray.push(new CBook());
        pos = this.BooksArray.length - 1;
        this.BooksArray[pos].ArrayID = pos;
        this.Hashes[divID] = pos;
        this.BooksArray[pos].DivID = divID;
        this.BooksArray[pos].Contents = sContents;
    }

    this.DelBook = function(divID) {
        this.BooksArray.splice(this.Hashes[divID], 1);
    }
}

function CBook() {
    this.ArrayID = 0;
    this.DivID = "";
    this.Contents = "";
}
我是这样解决的:

var oBooks = new CBooks();
function CBooks() {
    this.BooksArray = [];
    this.Hashes = {};

    this.AddBook = function(divID, sContents) {
        this.BooksArray.push(new CBook());
        pos = this.BooksArray.length - 1;
        this.BooksArray[pos].ArrayID = pos;
        this.Hashes[divID] = pos;
        this.BooksArray[pos].DivID = divID;
        this.BooksArray[pos].Contents = sContents;
    }

    this.DelBook = function(divID) {
        this.BooksArray.splice(this.Hashes[divID], 1);
    }
}

function CBook() {
    this.ArrayID = 0;
    this.DivID = "";
    this.Contents = "";
}


为什么要避免循环,是否存在严重的性能问题?如果没有:只做循环。如果是:使用某种散列桶系统?你有什么想法?我想避免循环,因为我认为可能有一些更快的方法可以借助javascript关联数组直接访问该元素。如果你不想循环,你需要使用字典或类似的哈希数据结构。我想你可以保留索引。试试看?这是一个很常见的问题。你要么自己做循环,要么你可以使用一个做循环的库。或正如@FritsvanCampen所提到的,您可以使用某种哈希系统,或者可以在book对象中存储索引。为什么要避免循环,是否存在严重的性能问题?如果没有:只做循环。如果是:使用某种散列桶系统?你有什么想法?我想避免循环,因为我认为可能有一些更快的方法可以借助javascript关联数组直接访问该元素。如果你不想循环,你需要使用字典或类似的哈希数据结构。我想你可以保留索引。试试看?这是一个很常见的问题。你要么自己做循环,要么你可以使用一个做循环的库。或正如@FritsvanCampen所提到的,您可以使用某种哈希系统,或者可以在book objects中存储索引。FWIW
Array.filter
在IE8上不受支持,如果这与OP有关。FWIW
Array.filter
在IE8上不受支持,如果这对OP很重要。除非你真的需要它在一个数组中,否则我会这样做。@pseudosavant,没错!谢谢你的确认:)除非你真的需要它在一个数组中,否则我会这样做。@pseudosavant,没错!感谢您的确认:)如果您真的必须将其放入数组中,这肯定有效,但哈希的开销确实更大。@pseudosavant您的意思是手动循环将比哈希更快?@MirrorMirror,我猜pseudosavant意味着使用数组比使用哈希的开销更大。。。对吗?一个数组几乎需要额外的开销。考虑从数组中删除一个元素需要移动所有的条目,或者修改它们的索引。这是一个线性时间运算。如果条目接近末尾,您可能会节省一些时间,但是接近开头的条目仍然需要接触几乎每个元素。(它可能是在本机代码中,所以速度可能会更快……但它仍然无法击败删除对象属性。)JSON根本不介意普通对象。唯一的怪癖是,您的
divID
s将作为键存在其中。这很容易通过在需要保存时创建一个值数组(不应该像查找资料那个样频繁)来解决。若确实需要将其放入数组中,这肯定会起作用,但散列的开销会更大。@pseudosavant您的意思是手动循环比散列快吗?@mirrormirr,我猜pseudosavant意味着使用数组比使用散列有更多的开销。。。对吗?一个数组几乎需要额外的开销。考虑从数组中删除一个元素需要移动所有的条目,或者修改它们的索引。这是一个线性时间运算。如果条目接近末尾,您可能会节省一些时间,但是接近开头的条目仍然需要接触几乎每个元素。(它可能是在本机代码中,所以速度可能会更快……但它仍然无法击败删除对象属性。)JSON根本不介意普通对象。唯一的怪癖是,您的
divID
s将作为键存在其中。在需要保存时创建一个值数组(不应该像查找资料那个样频繁),就可以很容易地解决这个问题。