[Ext插件]PinyinFilter:使用拼音首字母对数据进行过滤

这个插件的目的在于提高用户对于数据的选择效率。经常录入数据的人肯定能明白,在一长串列表中选择你想要记录是一件很费眼神的事;记得当初玩开心网可以按拼音首字母找到自己的好友,当时就觉得很是方便。如果您想提高用户对您软件的评价,请您考虑这个插件。

[img]http://dl.iteye.com/upload/attachment/236916/e3ea789a-1c1d-306d-9b8b-390db4bc3086.png[/img]
实现原理:重写了Store中返回过滤函数的方法,使其中需要过滤的汉字转换为其拼音首字母数组(因为有多音字,数组内每一项对应一种拼音的可能性),遍历数组每一项与当前输入项生成的前端匹配正则表达式进行比对,有一个满足就返回true,都不满足返回false

附件有示例

/**
* 修改组件内部Store的createFilterFn方法,使其按照拼音首字母进行过滤
*
* 1.0.1修改:
* 修复了多音字筛选不到的bug
*
* 1.0.2修改:
* 为store添加了一个拼音的缓存
*
* @author chemzqm@gmail.com
* @version 1.0.2
* @createTime 2010-04-18 23:12:31
*/
Ext.ns("Ext.ux");

Ext.ux.PinyinFilter=function(){
//主要方法,由字符串生成拼音首字母
function makePy(str){
if(typeof(str) != "string"){
return str;
}
var arrResult = new Array();
for(var i=0,len=str.length;i<len;i++){
var ch = str.charAt(i);
arrResult.push(checkCh(ch));
}
var resarr = mkRslt(arrResult);
return resarr;
}

function checkCh(ch){
var uni = ch.charCodeAt(0);
if(uni > 40869 || uni < 19968)
return ch; //dealWithOthers(ch);
return (oMultiDiff[uni]?oMultiDiff[uni]:(strChineseFirstPY.charAt(uni-19968)));
}

function mkRslt(arr){
var arrRslt = [""];
for(var i=0,len=arr.length;i<len;i++){
var str = arr[i];
var strlen = str.length;
if(strlen == 1){
for(var k=0;k<arrRslt.length;k++){
arrRslt[k] += str;
}
}else{
var tmpArr = arrRslt.slice(0);
arrRslt = [];
for(k=0;k<strlen;k++){
var tmp = tmpArr.slice(0);
for(var j=0;j<tmp.length;j++){
tmp[j] += str.charAt(k);
}
arrRslt = arrRslt.concat(tmp);
}
}
}
return arrRslt;
}

var strChineseFirstPY = 【太长,此处省略】
var oMultiDiff=【太长,此处省略】
//重写生成过滤方法的方法
function createFilterFn(property, value, anyMatch, caseSensitive){
if(Ext.isEmpty(value, false)){
return false;
}
value = this.data.createValueMatcher(value, anyMatch, false);
return function(r){
var os = r.data[property],arr;
if(this.pyCache[os]){
arr = this.pyCache[os];
}
else{
arr = makePy(os);
this.pyCache[os] = arr;
}
for(var i=0;i<arr.length;i++){
if(value.test(arr[i])){
return true;
}
}
return false;
};
}

return{
init:function(c){
var s=c.store;
s.createFilterFn = createFilterFn;//覆盖原方法
s.pyCache = {};//拼音缓存,汉字字符串与其拼音数组的映射
}
}
}()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值