js案例(身份证算法的实现)

js案例之身份证算法

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		身份证号:<input type="text" />
		<script src="./js/citys.js"></script>
		<script>
			var _input=document.querySelector("input");
			_input.onblur=function(){//失去焦点事件
				//this=>_input
				var num=this.value;
				var flag=checkId(num);
				if(!flag){
					alert("身份证信息不正确")
				}else{
					alert("正确")
				}
			}
			/*
			 18位: 41072419980815451x
			 410724 1998 0815 451x
			 41:省编码前2位
			 4107:市编码前4位
			 410724:县编码
			 45:派出所编码
			 1:奇数为男,偶数为女
			 x:计算所得
			     1、将前面的身份证号码17位数分别乘以不同的系数。
			        从第一位到第十七位的系数分别为:7、9、10、5、8、4、2、1、6、3、7、9、10、5、8、4、2;
			     2、将这17位数字和系数相乘的结果相加;
			     3、用加出来和除以11,看余数是多少;
			     4、余数只可能有0、1、2、3、4、5、6、7、8、9、10这11个数字,
				       其分别对应的最后一位身份证的号码为1、0、X、9、8、7、6、5、4、3、2。
			*/
			function checkId(ID) {
				//限定位数
				if (ID.length>18) {
					return false;
				}
				//获取身份证前2位  省编码前两位
				var provinceCode = ID.substr(0, 2);
				//获取省的数组
				var provinces = citys.districts[0].districts;
				//获取到的是对应的省
				var province = provinces.find(function(obj) {
					return obj.adcode.startsWith(provinceCode);
				})
				//省没有找到
				if (province == undefined) {
					return false;
				}

				//获取身份证前4位  市编码前两位
				var cityCode = ID.substr(0, 4);
				//获取市的数组
				var cs = province.districts;
				//获取到的是对应的市
				var city = cs.find(function(obj) {
					return obj.adcode.startsWith(cityCode);
				})
				if (city == undefined) {
					return false;
				}

				//获取身份证前6位  省编码前两位
				var countyCode = ID.substr(0, 6);
				//获取县的数组
				var countys = city.districts;
				//对应的县
				var county = countys.find(function(obj) {
					return obj.adcode==countyCode;
				})
                if (county == undefined) {
                	return false;
                }
				
				//验证最后一位
				var nums=[7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2];
				//分别相乘相加
				var res=nums.reduce(function(res,item,index){
					  res+=ID.charAt(index)*item;
					  return res;
				},0)
				
				var mod=res%11;   //拿到余数
				var endNums=[1,0,"x",9,8,7,6,5,4,3,2];
				if(ID.substring(17)!=endNums[mod]){
					return false;
				}
				return true;
			}

			console.log(checkId("410724199803031537"));
		</script>
	</body>
</html>
var citys = {
		"districts": [{	
				"adcode": "100000",
				"name": "中华人民共和国",
				"districts": [{
						"adcode": "410000",
						"name": "河南省",
						"districts": [{
								"citycode": "0379",
								"adcode": "410300",
								"name": "洛阳市",
								"center": "112.434468,34.663041",
								"level": "city",
								"districts": [{
									"citycode": "0379",
									"adcode": "410323",
									"name": "新安县",
									"center": "112.141403,34.728679",
									"level": "district",
									"districts": []
								}]
							},
							{
								"citycode": "0398",
								"adcode": "411200",
								"name": "三门峡市",
								"center": "111.194099,34.777338",
								"level": "city",
								"districts": [{
									"citycode": "0398",
									"adcode": "411221",
									"name": "渑池县",
									"center": "111.762992,34.763487",
									"level": "district",
									"districts": []
								}]
							}
						]
					},
					{
						"citycode": [],
						"adcode": "440000",
						"name": "广东省",
						"center": "113.280637,23.125178",
						"level": "province",
						"districts": [{
							"citycode": "0754",
							"adcode": "440500",
							"name": "汕头市",
							"center": "116.708463,23.37102",
							"level": "city",
							"districts": [{
								"citycode": "0754",
								"adcode": "440513",
								"name": "潮阳区",
								"center": "116.602602,23.262336",
								"level": "district",
								"districts": []
							}]
						}]
					}]

		    }]			
		}
总结

身份算法本身比较简单,只需要读者熟悉数组,对象的遍历方法,以及对字符串的操作即可,下面对其方法进行总结:

  1. 字符串:
<script>
   		//字符串下标从0开始
   		var str="Hello World!";
   		//1、获取字符串长度
   		console.log(str.length);//12
   		//2、字符串开头结尾
   		console.log(str.endsWith("rld!"));//true
   		console.log(str.startsWith("He"));//true
   		//3、查找字符串
   		//返回查找的第一个字符的下标
   		console.log(str.indexOf("o"));//4
   		//返回查找的最后一个字符的下标
   		console.log(str.lastIndexOf("orl"));//7
   		//查找是否有某个字符串,没有返回-1
   		console.log(str.indexOf("q"));//-1
   		//判断是否包含某个字符串,返回true/false
   		console.log(str.includes("o"));//true
   		
   		
   		//3、字符串截取
   		// start:开始下标;length:字符个数;end:结束下标
   		//substr[start,length)
   		console.log(str.substr(2,3));//llo
   		//substring[start,end)
   		console.log(str.substring(2,4));//ll
   		//slice[start,end)
   		console.log(str.slice(-2,-1));//l
   		console.log(str.substring(2));//llo World!

   		// 1、根据下标,返回对应的字符
   		console.log(str.charAt(2));//2
   		//字符串遍历
   		for (var i=0; i<str.length; i++){
   			console.log(str.charAt(i));
   		}
   		
   		//2、返回对应的unicode码
   		// 01-------AsII  unicode utf-8----e
   		//a-z:97-122    //A-Z:65-90
   		console.log(str.charCodeAt(1));//101
   		console.log(String.fromCharCode(101));//e
   		//3、字符串连接,返回一个新的字符串
   		var str2=str.concat("奇酷教育");
   		console.log(str);//Hello World!奇酷教育
   		console.log(str2);//Hello World!奇酷教育
   		//4、复制指定次数字符串
   		console.log(str.repeat(3));
   		//5、转换大小写
   		console.log(str.toLowerCase());//hello world!
   		console.log(str.toUpperCase());//HELLO WORLD!
   		//6、去除两边的空格
   		console.log("      123".trim());
   	</script>
  1. 数组
		<script>
		/***************数组的遍历**********************/
			 var scores=[10,20,50,90,80];
			//1、fori,i下标
			for (var i =0; i <scores.length; i++) {
				console.log(scores[i]);
			}
			//2、for 下标 in 数组名
			for(var i in scores){
				console.log(scores[i]);
			}
			//3、.forEach(function(每一项,对应下标,数组本身),
			//forEach方法没有返回值,回调函数
			scores.forEach(function(item,index,self){//不需要的参数可以不加
				console.log(item,index);
				console.log(self);
			})
			/************数组的追加删除***************/
			var names=['张三','李四','王五'];
			//末尾追加
			names[names.length]='赵六';
			names.push('郭靖','黄蓉');
			//末尾删除
			names.pop();
			//开头添加
			names.unshift('沈腾','马丽');
			//开头删除
			names.shift();
			console.log(names);
			//删除并替换
			// names.splice(startIndex,length,["替换的元素"])
			names.splice(1,1);  //删除张三
			console.log(names);
			names.splice(1,3,'程博','于航');
			console.log(names);
		    
			
			var num1=[10,20,30];
			var num2=[10,20,30,50,60];
			//数组连接
			var num3=num1.concat(num2);
			console.log(num3);
			//数组翻转
			num1.reverse();
			console.log(num1);
			//splice  截取  string也有
			var num5=num2.slice(1,4);
			console.log(num5);
			//拆分和合并
			//string  split
			var str='长亭外-古道边-芳草碧连天';
			//将字符串拆分为数组
			var array=str.split("-");
			console.log(array);
			//将数组合并为字符串
			var str2=array.join(",");
			console.log(str2);
			/******数组其他方法************/
						var ages=[50,80,90,35,55];
			//item:遍历到的当前元素
			//index:当前元素对应的下标
			//self:数组本身
			/* 
			  判断数组中每个元素是否符合条件
			  .every(function(item,index,self) 
			*/
			var bool1=ages.every(function(item,index,self){
				return item>60;
			})
			console.log(bool1);  //false
			/*
			  判断数组中是否有元素符合条件
			  .some(function(item,index,self) 
			*/
			var bool2=ages.some(function(item,index,self){
				return item>60;
			})
			console.log(bool2);  //true
			
			/*
			  返回符合条件的第一个元素
			  .find(function(item,index,self) 
			*/
			var num=ages.find(function(item,index,self){
				return item>60;
			})
			console.log(num); //80
			/*
			  返回符合条件的第一个元素下标
			  .findIndex(function(item,index,self) 
			  indexOf("60") 等值条件
			*/
			var firstIndex=ages.findIndex(function(item,index,self){
				return item>60;
			})
			console.log(firstIndex); //1
			
			
			/*
			  过滤出符合条件的所有元素
			  .find(function(item,index,self) 
			*/
			var array=ages.filter(function(item,index,self){
				return item>60;
			})
			console.log(array); //[80,90]
		</script>
  1. 对象
<body>
/***********对象的遍历****************/
		<ul>
   		<li></li>
   	</ul>
   	<script>
   		//遍历数组fori   for i in array   forEach
   		//遍历对象:  for key键 in 对象名
   		
   		var zs={
   			"name":"张三",
   			"age":20,
   			"sex":"男",
   			"height":1.83
   		}
   		
   		var _li=document.querySelector("li");
   		for(var key in zs){
   			//zs.key=>zs["key"],可以将变成字符串
   			_li.innerHTML+=key+":"+zs[key]+",";
   		}
   		
   		var array=[{
   			"name":"张三",
   			"age":20,
   			"sex":"男",
   			"height":1.83
   		},{
   			"name":"李四",
   			"age":20,
   			"sex":"女",
   			"height":1.65
   		},{
   			"name":"王五",
   			"age":20,
   			"sex":"男",
   			"height":1.78
   		}]
   		/*****************对象数组的遍历************/
   		var array=[{
   			"name":"张三",
   			"age":20,
   			"sex":"男",
   			"height":1.83
   		},{
   			"name":"李四",
   			"age":20,
   			"sex":"女",
   			"height":1.65
   		},{
   			"name":"王五",
   			"age":20,
   			"sex":"男",
   			"height":1.78
   		}]
   		
   		//obj:每一个对象
   		document.write("<ul>")
   		array.forEach(function(obj){
   			//每一条数据
   			document.write("<li>")
   			for (var key in obj) {
   				document.write(`${key}:${obj[key]}`)
   			}
   			document.write("</li>")
   			
   		})
   		document.write("</ul>")
   	</script>
   </body>

(如需验证各地身份证号需要完整js,由于完整js文件文件过大无法上传,因此上面仅为部分数据,如需完整版请联系作者!)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值