在从Backbone集合中过滤模型时维护索引
Maintain index while filter model from Backbone collection
我有一个集合
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);
相关文章:
- 名称输入的索引
- 在jQuery中获取表的行索引
- 测试索引值是否等于某个数字的倍数
- 循环遍历数组中的特定索引
- 按照选项卡索引的顺序循环一个jQuery选择
- 在JavaScript中通过索引从对象数组中获取值
- 尝试在PHP中回显输入文本时出现未定义的索引错误
- 在索引.html和应用.js [node.js] 之间共享变量
- 如何为高图中的区域线创建z索引
- 下拉列表在使用z索引放置在前面后停止工作
- 减去两个索引不同但值相同的整数
- 如何通过所选索引(AngularJS)在模态弹出窗口中显示数据
- Javascript:根据对象的嵌套数组中的值,在数组中查找对象的索引
- BackboneJS重新排列集合中模型的最佳方式,同时为每个模型维护0索引的有序属性
- 根据对象属性对 JavaScript 对象进行排序,但维护索引
- 遍历多个数组,组合成单个数组,维护子数组内的索引
- 根据提取的内部文本对节点进行排序,并在jQuery中维护索引关联或破解
- 自定义javascript对象排序和维护索引关联
- 在从Backbone集合中过滤模型时维护索引
- 如何在JQuery计数器中正确维护索引