前端常见的公共方法

// 数组去重
export function uniqueArr(arr) {
    return Array.from(new Set(arr))
}

// 获取字节长度
export function byteLength(str) {
    let s = str.length
    for (var i = str.length - 1; i >= 0; i--) {
        const code = str.charCodeAt(i)
        if (code > 0x7f && code <= 0x7ff) s++
        else if (code > 0x7ff && code <= 0xffff) s += 2
        if (code >= 0xDC00 && code <= 0xDFFF) i--
    }
    return s
}

// 解码并提取url地址中的参数
export function getUrlbject(url) {
    url = url == null ? window.location.href : url
    const search = url.substring(url.lastIndexOf('?') + 1)
    const obj = {}
    const reg = /([^?&=]+)=([^?&=]*)/g
    search.replace(reg, (rs, $1, $2) => {
        const name = decodeURIComponent($1)
        let val = decodeURIComponent($2)
        val = String(val)
        obj[name] = val
        return rs
    })
    return obj
}

// 深拷贝--递归
export function deepClone(target) {
    let result;
    // 如果当前需要深拷贝的是一个对象的话
    if (typeof target === 'object') {
        // 如果是一个数组的话
        if (Array.isArray(target)) {
            result = []; // 将result赋值为一个数组,并且执行遍历
            for (let i in target) {
                // 递归克隆数组中的每一项
                result.push(deepClone(target[i]))
            }
        } else if (target === null) {
            result = null;
            // 判断如果当前的值是一个RegExp对象的话,直接赋值    
        } else if (target.constructor === RegExp) {
            result = target;
        } else {
            // 否则是普通对象,直接for in循环,递归赋值对象的所有值
            result = {};
            for (let i in target) {
                result[i] = deepClone(target[i]);
            }
        }
        // 如果不是对象的话,就是基本数据类型,那么直接赋值
    } else {
        result = target;
    }
    return result;
}

// 脱敏处理-字符显示为*
export function desensitization(str, beginLen, endLen) {
    var len = str.length;
    var firstStr = str.substr(0, beginLen);
    var lastStr = str.substr(endLen);
    var middleStr = str.substring(beginLen, len - Math.abs(endLen)).replace(/[\s\S]/ig, '*');
    let tempStr = firstStr + middleStr + lastStr;
    return tempStr;
}

// 复制到剪切板
export function copyToClipboard(str) {
    const el = document.createElement('textarea');
    el.value = str;
    el.setAttribute('readonly', '');
    el.style.position = 'absolute';
    el.style.left = '-9999px';
    document.body.appendChild(el);
    el.select();
    document.execCommand('copy');
    document.body.removeChild(el);
}

// 金额转化为大写汉字
export function digitUppercase(price) {
    let fraction = ['角', '分'];
    let digit = [
        '零', '壹', '贰', '叁', '肆',
        '伍', '陆', '柒', '捌', '玖'
    ];
    let unit = [
        ['元', '万', '亿'],
        ['', '拾', '佰', '仟']
    ];
    let head = price < 0 ? '欠' : '';
    price = Math.abs(price);
    let s = '';
    for (let i = 0; i < fraction.length; i++) {
        s += (digit[Math.floor(price * 10 * Math.pow(10, i)) % 10] + fraction[i]).replace(/零./, '');
    }
    s = s || '整';
    price = Math.floor(price);
    for (let i = 0; i < unit[0].length && price > 0; i++) {
        let p = '';
        for (var j = 0; j < unit[1].length && price > 0; j++) {
            p = digit[price % 10] + unit[1][j] + p;
            price = Math.floor(price / 10);
        }
        s = p.replace(/(零.)*零$/, '').replace(/^$/, '零') + unit[0][i] + s;
    }
    return head + s.replace(/(零.)*零元/, '元')
        .replace(/(零.)+/g, '零')
        .replace(/^整$/, '零元整');
}

// 千分位去掉逗号
export function delNumFormat(snum) {
    return snum.replace(/,/g, '');
}


//在cookie定义值
export function setCookie(name, value) {
    var curWwwPath = window.document.location.href;
    var pathName = window.document.location.pathname;
    var pos = curWwwPath.indexOf(pathName);
    var localhostPath = curWwwPath.substring(0, pos);	//获取地址到端口号
    var projectName = pathName.substring(0, pathName.substr(1).indexOf('/') + 1); //项目名
    localhostPath = localhostPath.replace(/\"/g, "");
    projectName = projectName.replace(/\"/g, "");

    if (value) {
        var Days = 30;
        var exp = new Date();
        exp.setTime(exp.getTime() + Days * 24 * 60 * 60 * 1000);
        document.cookie = name + "=" + escape(value) + ";expires=" + exp.toGMTString();
    }
};

/**
 * cookie中取值
 * */
export function getCookie(name) {
    var arr, reg = new RegExp("(^| )" + name + "=([^;]*)(;|$)");	//匹配字段
    if (arr = document.cookie.match(reg)) {
        return unescape(arr[2]);
    } else {
        return null;
    }
};

/**
 * 清除指定cookie值
 * */
export function delCookie(name) {
    var exp = new Date();
    exp.setTime(exp.getTime() - 1);
    var cval = setCookie(name);
    if (cval && cval != null) {
        //		document.cookie = name + "=" + cval + ";expires=" + exp.toGMTString() + ";path=/video_learning" + ";domain=localhost";
        document.cookie = name + "=" + cval + ";expires=" + exp.toGMTString() + ";path=/video_learning" + ";domain=localhost";
    }
};

/**
 * 清除全部cookie值
 * */
export function clearCookie() {
    var curWwwPath = window.document.location.href;
    var pathName = window.document.location.pathname;
    var pos = curWwwPath.indexOf(pathName);
    var localhostPath = curWwwPath.substring(0, pos);	//获取地址到端口号
    var projectName = pathName.substring(0, pathName.substr(1).indexOf('/') + 1); //项目名
    localhostPath = localhostPath.replace(/\"/g, "");
    projectName = projectName.replace(/\"/g, "");

    var keys = document.cookie.match(/[^ =;]+(?=\=)/g);
    if (keys) {
        for (var i = keys.length; i--;) {
            //			document.cookie = keys[i] +'=0;expires=' + new Date( 0).toUTCString() + ";path=/video_learning" + ";domain=localhost";
            //			document.cookie = keys[i] +'=0;expires=' + new Date( 0).toUTCString() + ";path=" + projectName + ";domain=" + localhostPath;
            document.cookie = keys[i] + '=0;expires=' + new Date(0).toUTCString() + ";path=" + projectName + ";domain=" + GetCookieDomain();
        }
    }
};


export default {
    uniqueArr,
    byteLength,
    getUrlbject,
    deepClone,
    desensitization,
    copyToClipboard,
    digitUppercase,
    delNumFormat,
    setCookie,
    getCookie,
    delCookie,
    clearCookie
}


版权声明:本文为weixin_44769612原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。