网上现有的仅包含旧版的扩展方式,总结核心实现为将默认的字符串比较方式重写为使用JavaScript的localeCompare方法进行字符串顺序比较。
最近项目中使用的为ExtJS 6.2.0,旧版的重写applySort的方式无法使用,于是自行跟踪源码,找出了针对新版的中文排序实现方式。
核心原理为重写Ext.util.Sorter类的sortFn,当比较值为字符串时使用localeCompare进行比较并直接返回值,localeCompare的可能返回值为-1、0、1。
详见如下代码:
/**
* 解决汉字排序问题
*/
Ext.override(Ext.util.Sorter, {
sortFn: function (item1, item2) {
var me = this,
transform = me._transform,
root = me._root,
property = me._property,
lhs, rhs;
if (root) {
item1 = item1[root];
item2 = item2[root];
}
lhs = item1[property];
rhs = item2[property];
if (transform) {
lhs = transform(lhs);
rhs = transform(rhs);
}
//添加:修复汉字排序
if (typeof(lhs) == "string") {//若为字符串
return lhs.localeCompare(rhs, ‘zh‘);//则localeCompare比较汉字字符串,Firefox与IE均支持
}//添加结束
return (lhs > rhs) ? 1 : (lhs < rhs ? -1 : 0);
}
});