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

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


实现原理:重写了Store中返回过滤函数的方法,使其中需要过滤的汉字转换为其拼音首字母数组(因为有多音字,数组内每一项对应一种拼音的可能性),遍历数组每一项与当前输入项生成的前端匹配正则表达式进行比对,有一个满足就返回true,都不满足返回false

附件有示例

Js代码 复制代码
  1. /**  
  2.  * 修改组件内部Store的createFilterFn方法,使其按照拼音首字母进行过滤  
  3.  *  
  4.  * 1.0.1修改:  
  5.  * 修复了多音字筛选不到的bug  
  6.  *  
  7.  * 1.0.2修改:  
  8.  * 为store添加了一个拼音的缓存  
  9.  *   
  10.  * @author chemzqm@gmail.com  
  11.  * @version 1.0.2  
  12.  * @createTime 2010-04-18 23:12:31  
  13.  */  
  14. Ext.ns("Ext.ux");   
  15.   
  16. Ext.ux.PinyinFilter=function(){   
  17.     //主要方法,由字符串生成拼音首字母   
  18.     function makePy(str){   
  19.     if(typeof(str) != "string"){   
  20.         return str;   
  21.     }   
  22.     var arrResult = new Array();   
  23.     for(var i=0,len=str.length;i<len;i++){   
  24.         var ch = str.charAt(i);   
  25.         arrResult.push(checkCh(ch));   
  26.     }   
  27.     var resarr = mkRslt(arrResult);   
  28.     return resarr;   
  29.     }   
  30.        
  31.     function checkCh(ch){   
  32.         var uni = ch.charCodeAt(0);   
  33.         if(uni > 40869 || uni < 19968)   
  34.             return ch; //dealWithOthers(ch);   
  35.         return (oMultiDiff[uni]?oMultiDiff[uni]:(strChineseFirstPY.charAt(uni-19968)));   
  36.     }   
  37.        
  38.     function mkRslt(arr){   
  39.         var arrRslt = [""];   
  40.         for(var i=0,len=arr.length;i<len;i++){   
  41.             var str = arr[i];   
  42.             var strlen = str.length;   
  43.             if(strlen == 1){   
  44.                 for(var k=0;k<arrRslt.length;k++){   
  45.                     arrRslt[k] += str;   
  46.                 }   
  47.             }else{   
  48.                 var tmpArr = arrRslt.slice(0);   
  49.                 arrRslt = [];   
  50.                 for(k=0;k<strlen;k++){   
  51.                     var tmp = tmpArr.slice(0);   
  52.                     for(var j=0;j<tmp.length;j++){   
  53.                         tmp[j] += str.charAt(k);   
  54.                     }   
  55.                     arrRslt = arrRslt.concat(tmp);   
  56.                 }   
  57.             }   
  58.         }   
  59.         return arrRslt;   
  60.     }   
  61.        
  62.     var strChineseFirstPY =  【太长,此处省略】   
  63.     var oMultiDiff=【太长,此处省略】   
  64.     //重写生成过滤方法的方法   
  65.     function createFilterFn(property, value, anyMatch, caseSensitive){   
  66.         if(Ext.isEmpty(value, false)){   
  67.             return false;   
  68.         }   
  69.         value = this.data.createValueMatcher(value, anyMatch, false);   
  70.         return function(r){   
  71.         var os = r.data[property],arr;   
  72.         if(this.pyCache[os]){   
  73.         arr = this.pyCache[os];   
  74.         }   
  75.         else{          
  76.         arr = makePy(os);   
  77.         this.pyCache[os] = arr;   
  78.         }          
  79.         for(var i=0;i<arr.length;i++){   
  80.         if(value.test(arr[i])){   
  81.             return true;   
  82.         }   
  83.         }   
  84.             return false;   
  85.         };   
  86.     }   
  87.      
  88.   return{   
  89.         init:function(c){   
  90.         var s=c.store;   
  91.             s.createFilterFn = createFilterFn;//覆盖原方法   
  92.         s.pyCache = {};//拼音缓存,汉字字符串与其拼音数组的映射   
  93.         }   
  94.     }   
  95. }()  
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值