2013-05-21 2 views
1

Я хочу, чтобы иметь возможность удалять объект из массива без цикла всего массива объектов, чтобы увидеть, имеет ли текущий элемент массива идентификатор элемента, который я хочу удалить ,удалять объект массива без петлирования всего массива

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 

Теперь пользователь может нажать кнопку X в div, отображающем каждую книгу, чтобы он мог удалить книгу. Таким образом, кнопка X содержит:

onclick=oBooks.DelBook(this.id); 

Теперь, очевидно, в DelBook (DIVID) функцию я мог цикл по длине BooksArray и видеть каждый элемент, если это DIVID равно параметру и сращивания на этот момент, но я хочу избежать цикла.

Есть ли способ сделать это?

заранее спасибо

+4

Почему вы хотите чтобы избежать цикла, есть ли острая проблема с производительностью? Если нет: просто сделайте цикл. Если да: используйте какую-то систему хеш-ковша? Что у тебя было на уме? – Halcyon

+0

Я хочу избежать цикла, потому что я думал, что может быть какой-то более быстрый метод, чтобы просто получить доступ к этому элементу напрямую с помощью ассоциативных массивов javascript. – MIrrorMirror

+2

Если вы не хотите, чтобы цикл, вам нужно использовать словарь или аналогичную хэш-структуру данных. – levi

ответ

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 = ""; 
} 

Надеется, что это помогает

+2

Если вам действительно не нужно, чтобы он находился в массиве, это так, как я бы сделал Это. – pseudosavant

+0

@pseudosavant, да точно! Спасибо за подтверждение :) – intuitivepixel

2
arr.filter(function(item){ 
    Return item.id != idtoremove 
}); 

Это будет цикл под одеялом, но использует быстрый машинный код и легче читать. Если вы действительно хотите, O (1) удалить вам нужно использовать какой-то хэш и добавить дополнительные накладные расходы на создание и обновление массива

+0

FWIW 'Array.filter' не поддерживается в IE8, если это имеет значение для OP. – pseudosavant

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 = ""; 
} 
+0

Это определенно работает, если вам действительно нужно иметь его в массиве, но у него больше накладных расходов на хеширование. – pseudosavant

+0

@pseudosavant вы имеете в виду, что ручной цикл будет быстрее, чем хеширование? – MIrrorMirror

+0

@MirrorMirror, я предполагаю, что псевдозавант означает, что использование массива на всех имеет больше накладных расходов, а затем использование хэшей ... правильно? – intuitivepixel