按枚举序列的特定顺序对 backbone collection 进行排序
Sort backbone collection in specific order of enum sequence
我的 backbone collection 如下:
var model1 = new Backbone.Model({mode: 'EX'});
var model2 = new Backbone.Model({mode: 'AB'});
var model3 = new Backbone.Model({mode: 'DF'});
var model4 = new Backbone.Model({mode: 'AB'});
var model5 = new Backbone.Model({mode: 'DF'});
var model6 = new Backbone.Model({mode: 'AB'});
var myCollection = new backbone.Collection([model1,model2,model3,model4,model5, model6]);
现在我希望这个 collection 按一些业务顺序排序,假设所有模型首先具有 'DF' 模式,然后所有模型具有 'AB' 模式,最后是模型'EX'.
需要输出
/*my Collection.models should contains array of models in following sequence
after sorting */
[model3, model5, model2, model4, model6, model1]
我有另一个 java 脚本 object 我将根据它来决定这个模式序列。例如
var enum = {
1: 'DF',
2: 'AB',
3: 'EX'
}
所以这里字符串排序是没有用的。有人可以建议我如何在 backbone collection 上编写比较器来完成此排序
您需要使用自定义 comparator 扩展默认值 Backbone.Collection
:
var priority= ['DF', 'AB', 'EX'];
var Collection = Backbone.Collection.extend({
comparator: function(a, b) {
return priority.indexOf(a.get('mode')) > priority.indexOf(b.get('mode'));
}
});
var myCollection = new Collection([{
mode: 'EX'
}, {
mode: 'AB'
}, {
mode: 'DF'
}, {
mode: 'AB'
}, {
mode: 'DF'
}, {
mode: 'AB'
}]);
console.log(myCollection.pluck('mode'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/backbone.js/1.3.3/backbone-min.js"></script>
或使用对象图:
var priority = {
1: 'DF',
2: 'AB',
3: 'EX'
}
var Collection = Backbone.Collection.extend({
comparator: function(a, b) {
var i = _.findKey(priority, function(val) {
return val === a.get('mode')
});
var j = _.findKey(priority, function(val) {
return val === b.get('mode')
});
return i > j;
}
});
var myCollection = new Collection([{
mode: 'EX'
}, {
mode: 'AB'
}, {
mode: 'DF'
}, {
mode: 'AB'
}, {
mode: 'DF'
}, {
mode: 'AB'
}]);
console.log(myCollection.pluck('mode'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/backbone.js/1.3.3/backbone-min.js"></script>
我会翻转枚举器,这样您就可以轻松地对其进行索引。
var enumerator = {
DF: 1,
AB: 2,
EX: 3
};
var YourModel = Backbone.Model.extend({
defaults: {
mode: ''
}
});
var YourCollection = Backbone.Collection.extend({
model: YourModel,
comparator: function(m) {
return enumerator[m.get('mode')];
}
});
var yourCollection = new YourCollection([
{ mode: 'EX' },
{ mode: 'AB' },
{ mode: 'DF' },
{ mode: 'AB' }
]);
console.log(yourCollection.pluck('mode')); // ["DF", "AB", "AB", "EX"]
我的 backbone collection 如下:
var model1 = new Backbone.Model({mode: 'EX'});
var model2 = new Backbone.Model({mode: 'AB'});
var model3 = new Backbone.Model({mode: 'DF'});
var model4 = new Backbone.Model({mode: 'AB'});
var model5 = new Backbone.Model({mode: 'DF'});
var model6 = new Backbone.Model({mode: 'AB'});
var myCollection = new backbone.Collection([model1,model2,model3,model4,model5, model6]);
现在我希望这个 collection 按一些业务顺序排序,假设所有模型首先具有 'DF' 模式,然后所有模型具有 'AB' 模式,最后是模型'EX'.
需要输出
/*my Collection.models should contains array of models in following sequence
after sorting */
[model3, model5, model2, model4, model6, model1]
我有另一个 java 脚本 object 我将根据它来决定这个模式序列。例如
var enum = {
1: 'DF',
2: 'AB',
3: 'EX'
}
所以这里字符串排序是没有用的。有人可以建议我如何在 backbone collection 上编写比较器来完成此排序
您需要使用自定义 comparator 扩展默认值 Backbone.Collection
:
var priority= ['DF', 'AB', 'EX'];
var Collection = Backbone.Collection.extend({
comparator: function(a, b) {
return priority.indexOf(a.get('mode')) > priority.indexOf(b.get('mode'));
}
});
var myCollection = new Collection([{
mode: 'EX'
}, {
mode: 'AB'
}, {
mode: 'DF'
}, {
mode: 'AB'
}, {
mode: 'DF'
}, {
mode: 'AB'
}]);
console.log(myCollection.pluck('mode'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/backbone.js/1.3.3/backbone-min.js"></script>
或使用对象图:
var priority = {
1: 'DF',
2: 'AB',
3: 'EX'
}
var Collection = Backbone.Collection.extend({
comparator: function(a, b) {
var i = _.findKey(priority, function(val) {
return val === a.get('mode')
});
var j = _.findKey(priority, function(val) {
return val === b.get('mode')
});
return i > j;
}
});
var myCollection = new Collection([{
mode: 'EX'
}, {
mode: 'AB'
}, {
mode: 'DF'
}, {
mode: 'AB'
}, {
mode: 'DF'
}, {
mode: 'AB'
}]);
console.log(myCollection.pluck('mode'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/backbone.js/1.3.3/backbone-min.js"></script>
我会翻转枚举器,这样您就可以轻松地对其进行索引。
var enumerator = {
DF: 1,
AB: 2,
EX: 3
};
var YourModel = Backbone.Model.extend({
defaults: {
mode: ''
}
});
var YourCollection = Backbone.Collection.extend({
model: YourModel,
comparator: function(m) {
return enumerator[m.get('mode')];
}
});
var yourCollection = new YourCollection([
{ mode: 'EX' },
{ mode: 'AB' },
{ mode: 'DF' },
{ mode: 'AB' }
]);
console.log(yourCollection.pluck('mode')); // ["DF", "AB", "AB", "EX"]