一些JS公共方法 -- 笔记(持续更新)

109 阅读2分钟
/**
 * 根据name获取url上参数名称获取值
 */

getQueryStrings(url,name) {
    var result = url.match(new RegExp("[?&]" + name + "=([^&]+)", "i"));
    if (result == null || result.length < 1) {
        return "";
    }
    return result[1];
},
/**
 *  深拷贝 定义一个深拷贝函数  接收目标target参数
 */
deepClone(target) {
    // 定义一个变量
    let result;
    // 如果当前需要深拷贝的是一个对象的话
    if (typeof target === 'object') {
        // 如果是一个数组的话
        if (Array.isArray(target)) {
            result = []; // 将result赋值为一个数组,并且执行遍历
            for (let i in target) {
                // 递归克隆数组中的每一项
                result.push(this.deepClone(target[i]))
            }
            // 判断如果当前的值是null的话;直接赋值为null
        } else if (target === null) {
            result = null;
            // 判断如果当前的值是一个RegExp对象的话,直接赋值
        } else if (target.constructor === RegExp) {
            result = target;
        } else {
            // 否则是普通对象,直接for in循环,递归赋值对象的所有值
            result = target;
        }
    } else {
        // 如果不是对象的话,就是基本数据类型,那么直接赋值
        result = target;
    }
    // 返回最终结果
    return result;
},
/**
 * 将数组根据父type转换成树形结构
 * @param data 树形数组
 * @param fTypeField 代表父数组字段
 * @param fIdField 代表父数组id字段
 */
turnArrToTree(data,fTypeField,fIdField){
    let tempTree = {top:[]};

    for (let item of data){
        if(item[fTypeField]){
            if(tempTree[item[fTypeField]]){
                tempTree[item[fTypeField]].children.push(item)
            }else{
                tempTree[item[fTypeField]] = {children:[item]}
            }
        }else{
            //fTypeField为空,属于一级节点
            tempTree.top.push(this.deepClone(JSON.parse(JSON.stringify(item))))
        }
    }
    this.pushChildToParent(tempTree.top,tempTree,fIdField);
    return tempTree.top;
},

//将子节点插入到父节点到children中
pushChildToParent(parentArr,fullData,fIdField){
    for(let item of parentArr){
        if(fullData[item[fIdField]]){
            item.children = fullData[item[fIdField]].children;
            this.pushChildToParent(item.children, fullData,fIdField);
        }
    }
},
/**
 * 从本地存储获取数据并经过json转换
 * @param key
 * @returns {null|*}
 */
getStore(key) {
    let value = window.localStorage.getItem(key);
    if(value){
        return JSON.parse(value)
    }else{
        return undefined
    }
},

/**
 * 向本地存储存储经过json转换的数据
 * @param key
 * @param value
 * @returns {null|*}
 */
setStore(key,value) {
    if(key && value){
        window.localStorage.setItem(key,JSON.stringify(value))
    }else{
        return null
    }
},
//base64转blob
dataURItoBlob(base64Data) {
    var byteString;
    if(base64Data.split(',')[0].indexOf('base64') >= 0)
        byteString = atob(base64Data.split(',')[1]);
    else
        byteString = unescape(base64Data.split(',')[1]);
    var mimeString = base64Data.split(',')[0].split(':')[1].split(';')[0];
    var ia = new Uint8Array(byteString.length);
    for(var i = 0; i < byteString.length; i++) {
        ia[i] = byteString.charCodeAt(i);
    }
    let blob = new Blob([ia], {
        type: mimeString
    })
    return blob;
},
//url转文件
dataURLtoFile(dataUrl, fileName){
    var arr = dataUrl.split(','), mime = arr[0].match(/:(.*?);/)[1],
        bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
    while(n--){
        u8arr[n] = bstr.charCodeAt(n);
    }
    return new File([u8arr], fileName, {type:mime});
},

//文件转base64
fileToBase64(e,success=()=>{}){
    let reader = new FileReader();
    reader.readAsDataURL(e.target.files[0])
    reader.onload = function(e){
        success(this.result)
    }
},
/校验经度是否符合规范
//校验经度
checkLong(lng){
    if(lng){
        let longrg = /^(-|+)?(((\d|[1-9]\d|1[0-7]\d|0{1,3}).\d{0,6})|(\d|[1-9]\d|1[0-7]\d|0{1,3})|180.0{0,6}|180)$/;
        if(!longrg.test(lng)){
            return false;
        }
        return true;
    }else {
        return false;
    }

},

//校验纬度是否符合规范
//校验纬度
checkLat(lat){
    if (lat){
        let latreg = /^(-|+)?([0-8]?\d{1}.\d{0,6}|90.0{0,6}|[0-8]?\d{1}|90)$/;
        if(!latreg.test(lat)){
            return false;
        }
        return true;
    } else {
        return false;
    }

},

//百度经纬度转高德
bMapTransQQMap(lng, lat) {
    let x_pi = 3.14159265358979324 * 3000.0 / 180.0;
    let x = lng - 0.0065;
    let y = lat - 0.006;
    let z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_pi);
    let theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_pi);
    let lngs = z * Math.cos(theta);
    let lats = z * Math.sin(theta);

    return {
        longitude: lngs,
        latitude: lats
    }
},
/**
 * 检查身份证是否符合标准
 * val 身份证
 */
checkCardID(val) {
    if(this.checkCode(val)) {
        let date = val.substring(6,14);
        if(this.checkDate(date)) {
            if(this.checkProv(val.substring(0,2))) {
                return true;
            }
        }
    }
    return false;
},

/**
 * 校验码校验
 * val 身份证
 */
checkCode(val){
    let p = /^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/;
    let factor = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 ];
    let parity = [ 1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2 ];
    let code = val.substring(17);
    if(p.test(val)) {
        let sum = 0;
        for(let i=0;i<17;i++) {
            sum += val[i]*factor[i];
        }
        if(parity[sum % 11] == code.toUpperCase()) {
            return true;
        }
    }
    this.showToast('校验码校验验证失败')
    return false;
},
/**
 * 出生日期码校验
 * val 身份证
 */
checkDate(val){
    let pattern = /^(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)$/;
    if(pattern.test(val)) {
        let year = val.substring(0, 4);
        let month = val.substring(4, 6);
        let date = val.substring(6, 8);
        let date2 = new Date(year+"-"+month+"-"+date);
        if(date2 && date2.getMonth() == (parseInt(month) - 1)) {
            return true;
        }
    }
    this.showToast('出生日期码校验验证失败')
    return false;
},

/**
 * 省级地址码校验
 * val 身份证
 */
checkProv(val){
    let pattern = /^[1-9][0-9]/;
    let provs = {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:"澳门"};
    if(pattern.test(val)) {
        if(provs[val]) {
            return true;
        }
    }
    this.showToast('省级地址码校验验证失败')
    return false;
},
//数组去重
unique(arr){
    if (!Array.isArray(arr)){
        console.log('type error')
        return
    }
    let array = [];
    for (let i = 0; i < arr.length; i++){
        if (array.indexOf(arr[i]) === -1){
            array.push(arr[i])
        }
    }
    return array;
},