假设我有这些Backbone.js模型:
var Truck = Backbone.Model.extend({});
var truck1 = new Truck();
var truck2 = new Truck();
truck1.set("brand", "Ford");
truck2.set("brand", "Toyota");
truck3.set("brand", "Honda");
truck4.set("brand", "Ford");
然后,假设我们有一个Backbone.js集合:
var TruckList = Backbone.Collection.extend({
model: Truck,
comparator: function(truck) {
return truck.get("brand");
};
});
我是一个汽车收藏家,所以是时候把每一辆车都添加到我的收藏中了:
Trucks = new TruckList();
Trucks.add(truck1);
Trucks.add(truck2);
Trucks.add(truck3);
Trucks.add(truck4);
仅仅关注品牌属性,truck4就是truck1的翻版。我的收藏中不能有重复项。我需要我的收藏有独特的价值。
我的问题是,如何从我的Backbone.js收藏中删除重复的项目?
我应该为此使用Underscore.js吗?如果是这样,有人能提供一个如何做到这一点的工作/可运行的示例吗?
假设如下所示:
1.集合未排序
必须对品牌属性值
发布于 2011-06-21 04:26:47
我将覆盖TruckList集合中的add
方法,并使用下划线来检测其中的重复项并拒绝重复项。就像这样。
TruckList.prototype.add = function(truck) {
// Using isDupe routine from @Bill Eisenhauer's answer
var isDupe = this.any(function(_truck) {
return _truck.get('brand') === truck.get('brand');
});
// Up to you either return false or throw an exception or silently ignore
// NOTE: DEFAULT functionality of adding duplicate to collection is to IGNORE and RETURN. Returning false here is unexpected. ALSO, this doesn't support the merge: true flag.
// Return result of prototype.add to ensure default functionality of .add is maintained.
return isDupe ? false : Backbone.Collection.prototype.add.call(this, truck);
}
发布于 2012-06-27 15:36:24
要实现这一点,最简单的方法是确保要添加的模型具有唯一的ids。默认情况下,主干集合不会添加具有重复ids的模型。
test('Collection should not add duplicate models', 1, function() {
var model1 = {
id: "1234"
};
var model2 = {
id: "1234"
};
this.collection.add([model1, model2]);
equal(1, this.collection.length, "collection length should be one when trying to add two duplicate models");
});
发布于 2011-06-21 07:46:24
尝尝这个。它使用任何下划线方法来检测潜在的重复项,如果是,则将其转储出去。当然,您可能希望使用一个异常来修饰它,以使其更加健壮:
TruckList.prototype.add = function(newTruck) {
var isDupe = this.any(function(truck) {
return truck.get('brand') === newTruck.get('brand');
}
if (isDupe) return;
Backbone.Collection.prototype.add.call(this, truck);
}
顺便说一句,我可能会在Truck上写一个函数来做复制检查,这样集合就不会知道太多关于这种情况的信息。
https://stackoverflow.com/questions/6416958
复制相似问题