jquery实现手机号码选号的方法
本文实例讲述了jquery实现手机号码选号的方法。分享给大家供大家参考。具体如下:
前段时间看到联通的自由组合套餐非常诱人于是决定换号,但选号是个非常累人的活在免费的号码列表中选了好久都没选到心仪的号码,于是写了个脚本去分析这些手机号码,虽然不是非常准确,但至少把那堆垃圾号码过滤掉了。欢迎拍砖。
代码依赖jQuery,有兴趣的自己重构去除依赖。
建议使用Chrome浏览器的调试工具执行。
jquery手机号码分析评分:
/*class*/RegexpMatchScorer=function(/*RequiredRegExp*/reg,
/*RequiredNumber*/threshold){
returnfunction(/*Requiredchar[]*/numberArray){
if(!!numberArray&&!!reg&&!!threshold){
varmatcheList=numberArray.join().match(reg);
if(matcheList!=null){
returnmatcheList.length*threshold;
}
}
return0;
};
}
//分析后8位号码计算号码分数
functionanalyseNumbers(/*RequiredString[]*/numberList,
/*OptionalObject{begin,size}*/range,
/*Optionalfunction(char[])[]*/addtionRules){
//无4号码计分
functionnon4(numberArray){
varthreshold=4;
if(!numberArray.inArray("4")){
returnthreshold;
}
return0;
}
//总数字量加分最高10分
functionnumberCount(numberArray){
varthreshold=10;
varcharCount=uniqueArray(numberArray).length;
returnthreshold-((charCount-1)*(threshold/(numberArray.length-1)));
}
//重复次数加分
functionadjoinRepeat(numberArray){
varthreshold=2;
varscore=0;
for(vari=1;i<numberArray.length;i++){
vartimes=0;
if(numberArray[i-1]==numberArray[i]){
times++;
score+=threshold*times;
}else{
times=0;
}
}
returnscore;
}
//顺数加分(3位以上)
functionstraight(numberArray){
varthreshold=2.5;
varsideTimes=2.5//顺数在两端时2.5倍得分
varinverseTimes=0.6
varscore=0;
for(vari=2;i<numberArray.length;i++){
varsTimes=0;
variTimes=0;
if((Number(numberArray[i])-1==Number(numberArray[i-1])&&Number(numberArray[i])-2==Number(numberArray[i-2])&&++sTimes)
||(Number(numberArray[i])+1==Number(numberArray[i-1])&&Number(numberArray[i])+2==Number(numberArray[i-2])&&++iTimes)
){
varsc=0;
if(i==2||i==numberArray.length-1){
sc=threshold*sideTimes;//顺数在两端时2.5倍得分
}else{
sc=threshold;
}
score+=sc*(sTimes+iTimes*inverseTimes);
}else{
sTimes=0;
iTimes=0;
}
}
returnscore;
}
//数组去复
functionuniqueArray(parr){
function_unique(_arr,i){
if(i>=_arr.length){
return;
}
if(_arr[i]==_arr[i+1]){
_arr.splice(i+1,1);
_unique(_arr,i);
}else{
_unique(_arr,i+1);
}
}
vararr=parr.slice().sort();
_unique(arr,0);
returnarr;
}
/*************
*计分逻辑
**************/
varnonRepeatList=uniqueArray(numberList);
varscorerList=[non4,numberCount,adjoinRepeat,straight,
newRegexpMatchScorer(newRegExp("(6|8|9)","g"),0.7)];
if(!!addtionRules){
scorerList.concat(addtionRules);
}
varscoreTable=[];
//分析号码
nonRepeatList.forEach(function(data){
varscore=0;
varpn=data.toString();
if(!!range){
pn=pn.substr(range.begin,range.size);
}
varnumberArray=pn.split("");
scorerList.forEach(function(scorer){
score+=scorer(numberArray.slice());
});
//发布分数
scoreTable.push({"number":data,"score":score});
});
returnscoreTable;
}
抓取号码列表,分析:
//必须在num.10010.com下执行
varurl="http://num.10010.com/NumApp/GoodsDetail/queryMoreNums?callback=&province=51&cityCode=540&rankMoney=&groupKey=65070778&mid=&q_p=51&net=01&roleValue=&preFeeSel=0&keyValue=&Show4GNum=TRUE&q_p=";
varnl=[];
for(vari=1;i<=50;i++){
varurli=url+i;
$.get(urli,function(data,status){
var_json=eval(data);
for(varj=0;j<(_json.moreNumArray.length/7);j++){
varidx=j*7;
varnum=_json.moreNumArray[idx];
nl.push(num);
}
});
}
//待上面代码抓取号码完毕后分析号码
//查XX分以上的号码
(function(sc){varx=[];analyseNumbers(nl,{begin:-8,size:8}).forEach(function(d,i){if(d.score>=sc)x.push(d.number+":"+d.score);});returnx.sort().join("\n");})
(/*score*/10);
希望本文所述对大家的jquery程序设计有所帮助。