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": []
}]
}]
}]
}]
}
总结
身份算法本身比较简单,只需要读者熟悉数组,对象的遍历方法,以及对字符串的操作即可,下面对其方法进行总结:
- 字符串:
<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>
- 数组
<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>
- 对象
<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文件文件过大无法上传,因此上面仅为部分数据,如需完整版请联系作者!)