我想按字母顺序排序存储(ArrayStore和GroupingStore)和INSENSITIVELY情况.我正在使用singleSort()方法,但它区分大小写.
例如,
data = ['c', '1', 'A', 'a', 'C']
output = ['1', 'A', 'C', 'a', 'c']
myoutput = ['1', 'a', 'A', 'c', 'C'] or [['1', 'A', 'a', 'C', 'c'] // This is what I want
Run Code Online (Sandbox Code Playgroud)
有关如何实现这一目标的任何建议?
小智 19
我找到了一种更简单的方法
使用ExtJS 3.3.1,可能也适用于早期版本.
只需将字段的sortType定义为asCstring,如下所示:
new Ext.data.JsonStore({
url: 'my.php',
fields: [{name:'name', sortType:Ext.data.SortTypes.asUCString}],
sortInfo: { field: 'name', direction: 'ASC'}
});
Run Code Online (Sandbox Code Playgroud)
将此添加到您的代码中...要小心您的范围,因为您将对页面上的所有排序不区分大小写.我在论坛上找到了这段代码,并在3.2.1中成功使用了它.
Ext.data.Store.prototype.sortData = function(f, direction){
direction = direction || 'ASC';
var st = this.fields.get(f).sortType;
var fn = function(r1, r2) {
var v1 = st(r1.data[f]), v2 = st(r2.data[f]);
// ADDED THIS FOR CASE INSENSITIVE SORT
if (v1.toLowerCase) {
v1 = v1.toLowerCase();
v2 = v2.toLowerCase();
}
return v1 > v2 ? 1 : (v1 < v2 ? -1 : 0);
};
this.data.sort(direction, fn);
if (this.snapshot && this.snapshot != this.data) {
this.snapshot.sort(direction, fn);
}
Run Code Online (Sandbox Code Playgroud)
}
对于3.2.0,我必须覆盖createSortFunction函数,如下所示:
Ext.override(Ext.data.Store, {
// override
createSortFunction : function(field, direction) {
direction = direction || "ASC";
var directionModifier = direction.toUpperCase() == "DESC" ? -1 : 1;
var sortType = this.fields.get(field).sortType;
//create a comparison function. Takes 2 records, returns 1 if record 1 is greater,
//-1 if record 2 is greater or 0 if they are equal
return function(r1, r2) {
var v1 = sortType(r1.data[field]),
v2 = sortType(r2.data[field]);
// To perform case insensitive sort
if (v1.toLowerCase) {
v1 = v1.toLowerCase();
v2 = v2.toLowerCase();
}
return directionModifier * (v1 > v2 ? 1 : (v1 < v2 ? -1 : 0));
};
}
});
Run Code Online (Sandbox Code Playgroud)
希望这有助于某人.
transform:function(displayName){return displayName.toLowerCase(); }
store:
fields: ['value', 'displayName'],
data: [],
sorters: [{
property: 'displayName',
direction: 'ASC',
transform: function (displayName) { return displayName.toLowerCase(); }
}]
Run Code Online (Sandbox Code Playgroud)