做地图相关的项目就会涉及到地名地址的查询,那么查询的结果就是行政区划数据, 这个方法是为了更好的展示, 而对地名地址数据进行自动划分和截取的功能。
#方法体
/** *获取字符串简称的方法 *@param fullString 原字符串(必填) *@param key 截取的关键字(选填) 如果为空,则从头开始截取 *@param type 截取类型(next 下一个行政区划,last 最后一个行政区划,self 当前行政区划) *@param maxLen 最大长度(选填 默认为100) *@return 截取后的字符串的简称 *****/ function getShortName(fullString,key,type,maxLen){ if(!fullString){return "";} var defMaxLen = 10;//默认最大长度 //混合参数处理 if(typeof(key)=='undefined'){//没有第二个参数,则截取最大长度,然后立即返回。 return fullString.substr(0,defMaxLen); }else if(typeof(key)=='number'){//第二个参数是最大长度,则截取指定长度立即返回 maxLen = key-0||defMaxLen; return fullString.substr(0,maxLen); }else if(typeof(type)=='number'){//第三个参数是最大长度,那么第四个表示type类型 var temp = maxLen;//临时中间变量 maxLen = type-0||defMaxLen; type = temp||"last"; }else{//按照正常顺序传递参数 maxLen = maxLen-0 || defMaxLen; key = key||fullString; type = type||"last"; } if(fullString.indexOf(key)==-1){//查询关键字不在字符串中,则截取最大长度,然后立即返回。 return fullString.substr(0,maxLen); } //混合参数处理结束 //log("fullString ="+fullString+",key="+key+",type="+type+",maxLen = "+maxLen); var index = fullString.indexOf(key); var len = fullString.length; var unitArr = "国,省,市,区,县,乡,镇,村,州,组,委,盟,旗,号,胡同".split(",");//发现缺少则补充 街,路, var reg = new RegExp(unitArr.join("|"));//行政区划单位的正则 var wordArr = fullString.split(reg);//去掉了行政区划的地名地址的数组 var wordLen = wordArr.length;//所有地名地址的长度 //log(wordArr); //默认是获取最后一个也是最小范围的一个行政区划级别 //IE9,FF,Chrome下,fullString如果最后一个单词匹配正则,则wordArr最后一个是""字符串,所以得向前去一个 var name = wordArr[wordLen-1]||wordArr[wordLen-2];//默认type='last' //log("name = "+name); if("self"==type){//当前关键字所在的地名地址级别 name = key.replace(reg,"");//去掉了行政区划的当前的地名 }else if("next"==type){//下一个行政区划级别的地名地址 name = key.replace(reg,"");//去掉了行政区划的当前的地名 var nextIndex = 0;//通过循环,找到下一个地名地址所在的索引(没想到更好的办法) for(var i=0;i<wordLen;i++){ if(wordArr[i].indexOf(name)>=0 ){//使用模糊匹配 这个就是当前的地名地址所在的位置 if((i+1)<wordLen){//判断是否还有下一个 nextIndex = i+1; }else{//没有下一个了 nextIndex = i; } break; } } name = wordArr[nextIndex]; } var newName = name;//添加行政区划单位 // log("newName = "+newName); var matchCount = 0;//匹配次数 //由于数据可能不是按照正则里边的行政区划顺序,所以只能通过循环并比对的方法 for(var j=0;j<unitArr.length;j++){ //添加完行政区划后,可在字符串中找到。 if(fullString.indexOf(name+unitArr[j])>=0 ){ //log("中啦-----------newName="+newName); newName = name+unitArr[j]; matchCount++;//匹配次数自增 if("self"==type){//本身模式 找到第一个就break break; }else if("next"==type){ if(matchCount>=2){//next模式 只进行2次,使用matchCount区分次数 break; } }else{/*不可break,因为后边可能有重名的更小级别的行政区划 例如吉林省吉林市*/} } //log("matchCount="+matchCount); } newName = newName.substr(0,maxLen); //log("key = "+key+",newName = "+newName); //log("<br/>"); return newName; }
#测试
//测试数据 var value ="中国吉林省吉林市长春区延庆县合隆镇华西沟村"; log(getShortName(value,"吉林",4,"self")); log(getShortName(value,"吉林","next",4)); log(getShortName(value,"广顺南大街")); log(getShortName(value,"长春")); log(getShortName(value,"延庆县")); log(getShortName(value,"合隆镇")); log(getShortName(value,"ABC",5)); log(getShortName(value,"华西")); log(getShortName("中国北京市","北京")); log(getShortName(value,5)); log(getShortName(value,"长春",2)); log(getShortName("中国北京市","北京",4)); log(getShortName(value)); /* 返回结果: 吉林省 吉林市 中国吉林省吉林市长春 华西沟村 华西沟村 华西沟村 中国吉林省 华西沟村 北京市 中国吉林省 华西 北京市 */
愤怒的coder