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();

次のような新しい本を追加します。

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 がパラメーターと等しい場合は各要素を確認し、その時点でスプライスすることができますが、ループを避けたいと思います。

それを行う方法はありますか?

前もって感謝します

4

3 に答える 3

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

それが役に立てば幸い

于 2013-05-21T21:13:43.163 に答える
2
arr.filter(function(item){
  Return item.id != idtoremove
 });

これは内部でループしますが、高速なネイティブ コードを使用し、読みやすくなっています。本当に O(1) の削除が必要な場合は、ある種のハッシュを使用する必要があり、配列の作成と更新に余分なオーバーヘッドが追加されます

于 2013-05-21T21:24:03.387 に答える
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 = "";
}
于 2013-05-21T21:28:41.890 に答える