定义需要使用到的一些常量

/** VIN码允许使用的字符数组 */
const CharArray = ['1', '2', '3', '4', '5', '6', '7', '8', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'R', 'S', 'T', 'V', 'W', 'X', 'Y'];
/** 国标规定的VIN码的前两位数组 */
const ChinaArray = ['L0','L1','L2', 'L3', 'L4', 'L5', 'L6', 'L7', 'L8', 'L9', 'LA', 'LB', 'LC', 'LD', 'LE', 'LF', 'LG', 'LH', 'LJ', 'LK', 'LL', 'LM', 'LN', 'LP', 'LR', 'LS', 'LT', 'LU', 'LV', 'LW', 'LX', 'LY', 'LZ', 'H0', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'H7', 'H8', 'H9', 'HA', 'HB', 'HC', 'HD', 'HE', 'HF', 'HG', 'HH', 'HJ', 'HK', 'HL', 'HM', 'HN', 'HP', 'HR', 'HS', 'HT', 'HU', 'HV', 'HW', 'HX', 'HY', 'HZ',];
/** VIN码中各位置对应的加权值数组 */
const WeightValue = [8, 7, 6, 5, 4, 3, 2, 10, 0, 9, 8, 7, 6, 5, 4, 3, 2];

定义CharArray中的字符对应的值

/** CharArray中的字符对应的值 */
const VerifyArr = setVerify();

/** 将VIN中各码对应的值存入MAP中 */
function setVerfiy(){
let map = new Map();
// VIN码中各字母的charcode值
let charCodeArr = [65, 66, 67, 68, 69, 70, 71, 72, 74, 75, 76, 77, 78, 80, 82, 83, 84, 85, 86, 87, 88, 89, 90];
// VIN码中各对应的值
let valueArr = [1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 7, 9, 2, 3, 4, 5, 6, 7, 8, 9];
// 以字母为key值,存储该字母对应的值
for (let i = 0; i < 23; i++) {
map.set(String.fromCharCode(charCodeArr[i]), valueArr[i]);
}
// 以数字('字符串化')为key值,存储该数字对应的值
for (let j = 0; j < 10; j++) {
map.set(j + '', j);
}
// 抛出最终结果
return map;
}

验证VIN码中第九位是否正确

/** 计算VIN码的校验位 */
function getVerifyCode(vin) {
// VIN码从从第一位开始,码数字的对应值×该位的加权值,计算全部17位的乘积值相加除以11,所得的余数,即为第九位校验值
let tempVinArr = vin.split('');
let tempRes = 0;
for (let i = 0; i < 17; i++) {
tempRes += VerifyArr.get(tempVinArr[i] + '') * WeightValue[i];
}
let OperationRes = tempRes % 11;
let res = '';
if (OperationRes != 10) {
res = OperationRes + '';
} else {
res = 'X';
}
return res;
}

/** 判断VIN是否正确 */
function isCorrectVin(vin) {
let verifyCode = getVerifyCode(vin);
if (vin.substring(8, 9) == verifyCode) {
return true;
} else {
return false;
}
}

生成随机的虚拟VIN码

/** 生成随机前缀(前五位) */
function setRandomBeforeStr() {
let res = getRandomChar(ChinaArray);
res += getRandomChar(CharArray);
for (let i = 0; i < 5; i++) {
res += getRandomChar(CharArray);
}
return res;
}
/** 生成随机后缀(10-12位) */
function setRandomAfterStr() {
let res = '';
for (let i = 0; i < 3; i++) {
res += getRandomChar(CharArray);
}
res += productNo();
return res;
}

/** 生成随机的生产序号 */
function productNo() {
var result = '';
for (var i = 0; i < 5; i++) {
result += Math.floor(Math.random() * 16).toString(16); //获取0-16并通过toString转16进制
}
//默认字母小写,手动转大写
return result.toUpperCase(); //另toLowerCase()转小写
}
/** 拼接车架号 */
function spellVin(beforeStr, afterStr) {
let preVin = beforeStr + 'X' + afterStr;
let verifyCode = getVerifyCode(preVin);
let vin = beforeStr + verifyCode + afterStr;
if (isCorrectVin(vin)) {
return vin;
} else {
spellVin(beforeStr, afterStr);
}
}

/** 返回随机字符 */
function getRandomChar(array) {
return array[parseInt((Math.random() * 100) % array.length)];
}

/** 生成虚拟VIN码 */
function getRandomVin() {
let beforeStr = setRandomBeforeStr();
let afterStr = setRandomAfterStr();
let vin = spellVin(beforeStr, afterStr);
return vin;
}