js 实现身份证信息校验

用于身份证号码的比对校验

    checkIdentity(value) {
        if (value.length === 15) return true;
        if (value.length !== 18) return false;
        const address = value.substring(0, 6); // 6位,地区代码
        const birthday = value.substring(6, 14); // 8位,出生日期
        const province = {
            11: '北京',
            12: '天津',
            13: '河北',
            14: '山西',
            15: '内蒙古',
            21: '辽宁',
            22: '吉林',
            23: '黑龙江',
            31: '上海',
            32: '江苏',
            33: '浙江',
            34: '安徽',
            35: '福建',
            36: '江西',
            37: '山东',
            41: '河南',
            42: '湖北',
            43: '湖南',
            44: '广东',
            45: '广西',
            46: '海南',
            50: '重庆',
            51: '四川',
            52: '贵州',
            53: '云南',
            54: '西藏',
            61: '陕西',
            62: '甘肃',
            63: '青海',
            64: '宁夏',
            65: '新疆',
            71: '台湾',
            81: '香港',
            82: '澳门',
        };
        const year = birthday.substring(0, 4);
        const month = birthday.substring(4, 6);
        const day = birthday.substring(6);
        const tempDate = new Date(year, parseFloat(month) - 1, parseFloat(day));
        if (province[parseInt(address.substr(0, 2), 10)] == null ||
            (tempDate.getFullYear() !== parseFloat(year) ||
                tempDate.getMonth() !== parseFloat(month) - 1 || tempDate.getDate() !== parseFloat(day))) {
            // 这里用getFullYear()获取年份,避免千年虫问题
            return false;
        }
        const weightedFactors = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1]; // 加权因子
        const valideCode = [1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2]; // 身份证验证位值,当中10代表X
        const certificateNoArray = value.split(''); // 得到身份证数组
        let sum = 0; // 声明加权求和变量
        if (certificateNoArray[17].toLowerCase() === 'x') {
            certificateNoArray[17] = 10; // 将最后位为x的验证码替换为10
        }
        for (let i = 0; i < 17; i += 1) {
            sum += weightedFactors[i] * certificateNoArray[i]; // 加权求和
        }
        const valCodePosition = sum % 11; // 得到验证码所在位置
        if (Number(certificateNoArray[17]) === valideCode[valCodePosition]) return true;
        return false;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值