24、js工具29-37

59 阅读3分钟

29、判断当前的浏览器是否满足版本需求

/**
     * 判断当前的浏览器是否满足版本需求
     *
     * @method getBrowserInfo
     * @param {Number} vie 需要的ie最低版本,不支持则为0
     * @param {Number} vchrome 需要的chrome最低版本,不支持则为0
     * @param {Number} vff 需要的firefox最低版本,不支持则为0
     * @returns {Boolean}
     */
    getBrowserInfo(vchrome, vff, vie) {
        const agent = navigator.userAgent.toLowerCase()
        const regStr_ie = /msie [\d.]+/gi
        const regStr_ff = /firefox\/[\d.]+/gi
        const regStr_chrome = /chrome\/[\d.]+/gi
        let stutus = false
        let str = ''
        if (agent.indexOf('msie') > 0 && vie) {
            str = (agent.match(regStr_ie) + '').replace(/[^0-9.]/ig, '')
            stutus = str.split('.')[0] - vie >= 0 ? true : false
        }
        if ((!!window.ActiveXObject || "ActiveXObject" in window) && agent.indexOf('msie') < 0) {
            stutus = true
        }
        if (agent.indexOf('chrome') > 0 && vchrome) {
            str = (agent.match(regStr_chrome) + '').replace(/[^0-9.]/ig, '')
            stutus = str.split('.')[0] - vchrome >= 0 ? true : false
        }
        if (agent.indexOf('firefox') > 0 && vff) {
            str = (agent.match(regStr_ff) + '').replace(/[^0-9.]/ig, '')
            stutus = str.split('.')[0] - vff >= 0 ? true : false
        }
        return stutus
    },

30、深度克隆对象,不支持对象内方法的克隆

/**
     * 深度克隆对象,不支持对象内方法的克隆
     * @param {Objectany} source 待拷贝对象
     * @returns {Object}
     */
    deepClone(source) {
        return JSON.parse(JSON.stringify(source))
    },

31、HTMLDecode 反转义特殊字符

/**
     * @method HTMLDecode 反转义特殊字符
     * @param {String} text 字符串
     * @returns {String}
     */
    HTMLDecode(text, type) {
        if(type === 'match') {
            let SPECIAL_CHARS = ["%", "_", "<", ">", "(", ")",'"',"&", " "]
            let ESCAPE_SPECIAL_CHARS = ["\\\\%", "\\\\_", "&lt;", "&gt;", "&#40;", "&#41;","&quot;","&amp;","&nbsp;"]
            ESCAPE_SPECIAL_CHARS.forEach((item, i) => {
                text = text.replace(new RegExp( item , "g" ), SPECIAL_CHARS[i])
            })
            return text
        }
        let temp = new DOMParser()
        let output = (temp.parseFromString(text, 'text/html')).body.textContent || ''
        temp = null
        return output
    },

31、decodeObj() 转化html中的转义字符

/**
     * @method decodeObj() 转化html中的转义字符
     * @param obj 获取的对象
     * @returns {Object}
     */
    decodeObj(obj, type) {
        if (typeof obj === 'string') {
            return this.HTMLDecode(obj, type)
        } else if (typeof obj === 'object' && !(obj instanceof Array) && obj !== null) {
            //object
            let temp = {}
            for (let [key, value] of Object.entries(obj)) {
                temp[key] = this.decodeObj(value, type)
            }
            return temp
        } else if (typeof obj === 'object' && obj instanceof Array) {
            // array
            return obj.map(item => {
                return this.decodeObj(item, type)
            })
        }
        return obj
    },

32、subStr 多出部分加...

/**
     * @method  subStr 多出部分加...
     * @param str 需要转化的字符串
     * @param n 需要显示的字符长度
     */
     subStr(str, n) {
        if (str) {
            let r = /[^\x00-\xff]/g;
            if (str.replace(r, "mm").length <= n) { return str }
            let m = Math.floor(n / 2);
            for (let i = m; i < str.length; i++) {
                if (str.substr(0, i).replace(r, "mm").length >= n) {
                    return str.substr(0, i) + "...";
                }
            }
        }
        return str;
    },

33、多出部分加...

 /**
     * @method formatData 多出部分加...
     * @param text 需要转化的字符串
     * @param len 需要显示的字符长度
     */
    formatData(text, len = 10) {
        let str = text
        if (str && str.length > len) {
            str = str.substring(0, len) + '...'
        }
        return str
    },

34、每隔n个字符加入操作符

  /**
     * @method nReplace 每隔n个字符加入操作符
     * @param text 需要转化的字符串
     * @param len 字符串的长度
     * @param op 操作符'\n'等
     */
    nReplace(text, len, op = '\n') {
        let str = text
        let re = new RegExp(`(.{${len}})`, 'g')
        if (str && str.length > len) {
            str = str.replace(re, `$1${op}`)
        }
        return str
    },

35、简单数据转化成ztree数据

/**
     * @method simpleToArray 简单数据转化成ztree数据
     * @param params simple设置
     ***/
    simpleToArray(sNodes, params = {}) {
        var i, l,
            key = params.idKey || 'id',
            val = 'value',
            kk = 'key',
            title = 'title',
            name = params.nameKey || 'name',
            parentKey = params.parentKey || 'pId',
            childKey = 'children'
        if (!key || !sNodes) return [];
        if (Object.prototype.toString.apply(sNodes) === "[object Array]") {
            var r = [];
            var tmpMap = {};
            for (i = 0, l = sNodes.length; i < l; i++) {
                tmpMap[sNodes[i][key]] = sNodes[i];
                sNodes[i][kk] = sNodes[i][val] = sNodes[i][key]
                sNodes[i][title] = sNodes[i][name]
            }
            for (i = 0, l = sNodes.length; i < l; i++) {
                if (tmpMap[sNodes[i][parentKey]] && sNodes[i][key] !== sNodes[i][parentKey]) {
                    if (!tmpMap[sNodes[i][parentKey]][childKey])
                        tmpMap[sNodes[i][parentKey]][childKey] = []
                    tmpMap[sNodes[i][parentKey]][childKey].push(sNodes[i])
                } else {
                    r.push(sNodes[i])
                }
            }
            return r
        }
        return [sNodes]
    },

36、组织树数据格式化

// 组织树数据格式化
    transformData(tree) {
        let arr = [];
        if (!!tree && tree.length !== 0) {
            tree.forEach(item => {
                let obj = {};
                obj.title = item.name;
                obj.key = item.id;
                obj.value = item.id;
                obj.checked = item.checked;
                obj.children = this.transformData(item.children); // 递归调用
                arr.push(obj);
            });
        }
        return arr;
    },

37、导出

/**
     * @method saveFile() 导出
     * @param {base64} data 导出的数据,待转
     * @param {String} fileName 名称
     * @param type 保存的文件类型,目前只有excel和zip
     */
    saveFile(data, fileName, type = 'excel') {
        const ZIP = 'application/zip;charset=utf-8'
        const EXCEL = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8'
        let terminalType = ''
        if (type === 'excel') {
            terminalType = EXCEL
        } else if (type === 'zip') {
            terminalType = ZIP
        }
        var blob = ''
        if (typeof (data) === 'string') {
            let code = atob(data.replace(/\r\n/g, ''))
            var abuffer = new window.ArrayBuffer(code.length)
            var uBuffer = new window.Uint8Array(abuffer)
            for (var i = 0; i < code.length; i++) {
                uBuffer[i] = code.charCodeAt(i) & 0xff
            }
            blob = new Blob([uBuffer], {
                type: terminalType
            })
        } else {
            blob = new Blob([data], {
                type: terminalType
            })
        }
        if (window.navigator.msSaveOrOpenBlob) {
            // iE下使用msSaveBlob进行导出
            navigator.msSaveBlob(blob, fileName)
        } else {
            var href = window.URL.createObjectURL(blob)
            var save_link = document.createElementNS('http://www.w3.org/1999/xhtml', 'a')
            save_link.href = href
            save_link.download = fileName
            // 解决火狐兼容问题
            document.body.appendChild(save_link)
            var event = document.createEvent('MouseEvents')
            event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null)
            save_link.dispatchEvent(event)
            document.body.removeChild(save_link)
            window.URL.revokeObjectURL(href)
        }
    },