在从Backbone集合中过滤模型时维护索引

Maintain index while filter model from Backbone collection

本文关键字:维护 索引 模型 过滤 Backbone 集合 在从      更新时间:2023-09-26

我有一个集合

var Book = Backbone.Model.extend({
    defaults:{
       name: '',
       author: ''
    }
});
var BookCollection = Backbone.Collection.extend({
     model: Book
});

/*** Populate the Collection ***/
var b1 = new Book({name: 'Java programming', author: 'John Doe'});
var b2 = new Book({name: 'C# programming', author: 'Alice Jane'});
var b3 = new Book({name: 'SQL in depth', author: 'James Wayne'});
var bkCollection = new BookCollection();
bkCollection.push(b1);
bkCollection.push(b2);
bkCollection.push(b3);
//I want to remove all models where name contains word 'programming'
var RESTRICTED = 'programming';
bkCollection.each(function(book){
    if(book.get('name').indexOf(RESTRICTED) > -1){
        bkCollection.remove(book);
    }
});

然而,在某些情况下,当有大量记录(> 100)时,我最终得到未定义的模型和编程标题

从Backbone的集合中过滤出模型的正确方法是什么?

bkCollection.remove(book);正在从集合中删除一个模型,因为它遍历它。相反,将模型推入数组,然后从集合中删除。

var Book = Backbone.Model.extend({
    defaults:{
       name: '',
       author: ''
    }
});
var BookCollection = Backbone.Collection.extend({
     model: Book
});
/*** Populate the Collection ***/
var b1 = new Book({name: 'Java programming', author: 'John Doe'});
var b2 = new Book({name: 'C# programming', author: 'Alice Jane'});
var b3 = new Book({name: 'SQL in depth', author: 'James Wayne'});
var bkCollection = new BookCollection();
bkCollection.push(b1);
bkCollection.push(b2);
bkCollection.push(b3);
//I want to remove all models where name contains word 'programming'
var RESTRICTED = 'programming';
var booksToRemove = new Array(); //cfa: the array that will hold the books to be removed
bkCollection.each(function(book){
    if((book.get('name').indexOf(RESTRICTED)) > -1){
        booksToRemove.push(book); // cfa: push the model into the array
    }
});
bkCollection.remove(booksToRemove); // remove from collection
console.log('Updated Collection is ' + JSON.stringify(bkCollection));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/backbone.js/1.3.3/backbone-min.js"></script>

问题是在迭代期间删除模型,正如bvoleti已经提到的。您可以通过使用内置方法(如filter而不是each)轻松解决此问题:

var RESTRICTED = 'programming';
var matches = bkCollection.filter(function(book){
  return book.get('name').indexOf(RESTRICTED) > -1;
});
bkCollection.remove(matches);