“闲来无事,收集整理了一些日常开发中可能用到的一些 JS 工具函数,在面向 ctrl+c 编程的场景下可以直接使用。。。
强密码检测
// 为8-20位字符且必须同时包含大写字母、小写字母、数字、特殊字符
export const isSrongPwd = (pwd: string): boolean => {
const reg = /^(?![A-z0-9]+$)(?=.[^%&',;=?$\x22])(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9]).{8,20}$/;
const isStrongPwd: boolean = reg.test(pwd);
return isStrongPwd;
};
校验身份证号码是否正确
export const checkIDCard = (idcode: string) => {
// 加权因子
let weight_factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
// 校验码
let check_code = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];
let code = idcode + '';
let last = idcode[17]; //最后一位
let seventeen = code.substring(0, 17);
// ISO 7064:1983.MOD 11-2
// 判断最后一位校验码是否正确
let arr: any[] = seventeen.split('');
let len = arr.length;
let num = 0;
for (let i = 0; i < len; i++) {
num = num + arr[i] * weight_factor[i];
}
// 获取余数
let resisue = num % 11;
let last_no = check_code[resisue];
// 格式的正则
// 正则思路
/*
第一位不可能是0
第二位到第六位可以是0-9
第七位到第十位是年份,所以七八位为19或者20
十一位和十二位是月份,这两位是01-12之间的数值
十三位和十四位是日期,是从01-31之间的数值
十五,十六,十七都是数字0-9
十八位可能是数字0-9,也可能是X
*/
let idcard_patter = /^[1-9][0-9]{5}([1][9][0-9]{2}|[2][0][0|1][0-9])([0][1-9]|[1][0|1|2])([0][1-9]|[1|2][0-9]|[3][0|1])[0-9]{3}([0-9]|[X])$/;
// 判断格式是否正确
let format = idcard_patter.test(idcode);
// 返回验证结果,校验码和格式同时正确才算是合法的身份证号码
return last === last_no && format;
};
根据身份证号码取出生日
export const getBirthDayByID = (idNo: string) => {
return `${idNo.substring(6, 10)}-${idNo.substring(10, 12)}-${idNo.substring(12, 14)}`;
}
将科学计数法转化为正常的值
export const toNonExponential = (num: number) => {
if (!num) return 0;
const m: any = num.toExponential().match(/\d(?:\.(\d*))?e([+-]\d+)/);
return Number(num.toFixed(Math.max(0, (m[1] || '').length - m[2])));
}
url 地址参数解析
export const parseUrl = (url: string) => {
let result: any = {};
let query = url.split('?')[1];
let queryArr = query.split('&');
queryArr.forEach(function (item: any) {
let value = item.split('=')[1];
let key = item.split('=')[0];
result[key] = value;
});
return result;
}
前端下载接口返回的二进制流文件
export const downloadBlob = (fileName: string = '', data?: any) => {
let binaryData = [];
const elink = document.createElement('a');
elink.download = fileName;
binaryData.push(data);
elink.style.display = 'none';
elink.href = window.URL.createObjectURL(new Blob(binaryData));
document.body.appendChild(elink);
elink.click();
URL.revokeObjectURL(elink.href);
document.body.removeChild(elink);
};
注:上面 data 参数是接口返回的二进制流数据,如果用 axios,可以类似如下取出数据:
http.interceptors.response.use(
(res) => {
if (res.status === 200) {
// 文件流下载
if (res.data) {
if(res.data instanceof ArrayBuffer || res.data instanceof Blob){
if(res.headers["content-disposition"]){
return {
fileName: decodeURIComponent(res.headers["content-disposition"].split(";")[1].split("filename=")[1]),
data:res.data
}
}else {
const msg = '没有可以下载的数据';
message.error(msg);
return Promise.reject(msg);
}
}
}
}
// 其他代码
// ....
})
千分位逗号分隔数字
export const numFormat = (num: any) => {
num = `${num}`;
let c = null;
if(num.toString().indexOf('.') !== -1){
c = Number(num).toLocaleString();
} else {
c= num.toString().replace(/(\d)(?=(?:\d{3})+$)/g, '$1,');
}
return c;
};
前端生成uuid唯一码函数
export const getUuid = (len: number, radix: number) => {
let chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');
let uuid = [],
i;
radix = radix || chars.length;
if (len) {
for (i = 0; i < len; i++) uuid[i] = chars[0 | (Math.random() * radix)];
} else {
let r;
uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';
uuid[14] = '4';
for (i = 0; i < 36; i++) {
if (!uuid[i]) {
r = 0 | (Math.random() * 16);
uuid[i] = chars[i == 19 ? (r & 0x3) | 0x8 : r];
}
}
}
return uuid.join('');
};
js实现复制
export const jsCopy = (content:string) => {
if (!content) {
// 提示Message换成自己的UI框架的
Message.success('没有可复制的内容');
return;
}
const input = document.createElement('input');
document.body.appendChild(input);
input.setAttribute('value', content);
input.select();
if (document.execCommand('copy')) {
document.execCommand('copy');
// 提示Message换成自己的UI框架的
Message.success('复制成功');
}
document.body.removeChild(input);
}
移动号码校验
export const checkPhoneNo = (card:string) => {
const reg = /^1[3456789]\d{9}$/;
if (!reg.test(card)) {
return false;
}
return true;
};
滚动到某个HTML node节点(注意兼容性)
// 滚动到某个节点
export cosnt scrollSomeNode = (ele)=> {
ele && ele.scrollIntoView();
}
本文使用 mdnice 排版