六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 64|回复: 0

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

[复制链接]

升级  24%

22

主题

22

主题

22

主题

秀才

Rank: 2

积分
86
 楼主| 发表于 2013-1-15 02:36:24 | 显示全部楼层 |阅读模式
这个插件的目的在于提高用户对于数据的选择效率。经常录入数据的人肯定能明白,在一长串列表中选择你想要记录是一件很费眼神的事;记得当初玩开心网可以按拼音首字母找到自己的好友,当时就觉得很是方便。如果您想提高用户对您软件的评价,请您考虑这个插件。


实现原理:重写了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;            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)){    return true;}    }            return false;        };    }    return{        init:function(c){    var s=c.store;            s.createFilterFn = createFilterFn;//覆盖原方法    s.pyCache = {};//拼音缓存,汉字字符串与其拼音数组的映射        }    }}()
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表