我希望能够从数组中删除一个对象而不循环所有对象数组,以查看当前数组元素是否具有我想要删除的项目的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();
我添加了这样一本新书:
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等于参数和splice at那一点,但我想避免循环。
有什么办法吗?
提前致谢
答案 0 :(得分:5)
这样的东西可行,但前提是你愿意放弃用于哈希的数组。
您的代码经过编辑
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 = "";
}
希望有所帮助
答案 1 :(得分:2)
arr.filter(function(item){
Return item.id != idtoremove
});
这将在幕后循环,但使用快速的本机代码,更容易阅读。如果你真的想要O(1)删除你需要使用某种哈希并且会在创建和更新数组时增加额外的开销
答案 2 :(得分:0)
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 = "";
}