面向Ctrl+C编程之JS常用函数(动态更新)

471 阅读1分钟

闲来无事,收集整理了一些日常开发中可能用到的一些 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 排版