javascript 常用应用

1、解决小数相加的误差

function add(arg1, arg2) {
    var r1, r2, m;
    try { r1 = arg1.toString().split(".")[1].length } catch (e) { r1 = 0 }
    try { r2 = arg2.toString().split(".")[1].length } catch (e) { r2 = 0 }
    m = Math.pow(10, Math.max(r1, r2));
    return (arg1 * m + arg2 * m) / m;
}

2、 解决小数相减的误差

function accSub(arg1, arg2) {
    var r1, r2, m, n;
    try { r1 = arg1.toString().split(".")[1].length } catch (e) { r1 = 0 }
    try { r2 = arg2.toString().split(".")[1].length } catch (e) { r2 = 0 }
    m = Math.pow(10, Math.max(r1, r2));
    n = (r1 >= r2) ? r1 : r2;
    return ((arg1 * m - arg2 * m) / m).toFixed(n);
}

3、除法函数,用来得到精确的除法结果

javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。

function accDiv(arg1, arg2) {
    var t1 = 0, t2 = 0, r1, r2;
    try { t1 = arg1.toString().split(".")[1].length } catch (e) { }
    try { t2 = arg2.toString().split(".")[1].length } catch (e) { }
    with (Math) {
        r1 = Number(arg1.toString().replace(".", ""))
        r2 = Number(arg2.toString().replace(".", ""))
        return (r1 / r2) * pow(10, t2 - t1);
    }
}

4、乘法函数,用来得到精确的乘法结果

javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。

function accMul(arg1, arg2) {
    var m = 0, s1 = arg1.toString(), s2 = arg2.toString();
    try { m += s1.split(".")[1].length } catch (e) { }
    try { m += s2.split(".")[1].length } catch (e) { }
    return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m)
}

5、防抖

/**
 * @desc 函数防抖
 * @param func 函数
 * @param wait 延迟执行毫秒数
 * @param immediate true 表立即执行,false 表非立即执行
 * 连续点击不执行
 */
function debounce(func,wait,immediate) {
    let timeout;

    return function () {
        let context = this;
        let args = arguments;

        if (timeout) clearTimeout(timeout);
        
        if (immediate) { // 立即执行
            var callNow = !timeout;
            timeout = setTimeout(() => {
                timeout = null;
            }, wait)
            if (callNow) func.apply(context, args)
        }
        else { // 非立即执行
            timeout = setTimeout(function(){
                func.apply(context, args)
            }, wait);
        }
    }
}

6、节流

/**
 * @desc 函数节流
 * @param func 函数
 * @param wait 延迟执行毫秒数
 * @param type 1 表时间戳版,2 表定时器版
 * 连续点击执行一次
 */
function throttle(func, wait, type) {
    if (type === 1) {
        let previous = 0;
    } else if (type === 2) {
        let timeout;
    }
    return function () {
        let context = this;
        let args = arguments;
        if (type === 1) {
            let now = Date.now(); // 获取当前时间戳

            if (now - previous > wait) {
                func.apply(context, args);
                previous = now;
            }
        } else if (type === 2) {
            if (!timeout) { // 判断定时器的存在决定是否执行
                timeout = setTimeout(() => {
                    timeout = null;
                    func.apply(context, args)
                }, wait)
            }
        }
    }
}

7、文件上传前判断文件是否为图片类型以及其大小

1、函数

/**
 * 判断上传的文件是否为图片与图片的大小
 * @param {string}  FileId  文件按钮id
 * @param {number}  maxsize  图片大小(单位/M)
 */
function imgTypeSize(FileId, maxsize) {
	/*获取图片内容对象*/
	var imgFile = document.getElementById(FileId).files[0];
	if(imgFile.name == "") {
		alert("请上传图片");
		return false;
	} else {
		/*图片类型正则验证*/
		var imgStr = /\.(jpg|jpeg|png|bmp|BMP|JPG|PNG|JPEG)$/;
		if(!imgStr.test(imgFile.name)) {
			alert("文件不是图片类型");
			return false;
		} else {
			/*图片大小*/
			var imagSize = imgFile.size;
			if(imagSize < (1024 * 1024 * maxsize)) {
				return true;
			} else {
				alert(imgFile.name + "大小不能超过" + maxsize + "M");
				return false;
			}
		}
	}
};

2、html

<input type="file" name="imgId" id="imgId" value="" />

3、js调用

//判断是否为图片,若为图片,判断其大小是否大于0.5M
imgTypeSize('imgId',0.5)

原文链接:传送门

8、文件上传至本地(刷新页面丢失)

    upload(file) {
      var a = file.file;
      var b = window.URL;
      var c = b.createObjectURL(a);
      console.log(c); //本地文件路径
    },

9、判断一个值是数组还是对象

 function dataType(value) {
    if (Object.prototype.toString.call(value) === "[object Array]") {
         console.log('value是数组');
     } else if (Object.prototype.toString.call(value) === '[object Object]') {
         console.log('value是对象');
     } 
 }

10、导出excel中的数据,生成json格式数据

使用 xlsx.core.min.js 插件

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>导出excel中的数据</title>
</head>

<body>
    <input type="file" value=" " onchange="importXlsx(this)" />

    <script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.14.0/xlsx.core.min.js"></script>

    <script>

        function importXlsx(e) {

            const files = e.files;

            let i, f;

            for (i = 0, f = files[i]; i != files.length; ++i) {

                let reader = new FileReader();

                let name = f.name;

                reader.onload = function (e) {

                    let data = e.target.result;

                    let workbook = XLSX.read(data, {

                        type: typeof FileReader !== "undefined" && (FileReader.prototype || {}).readAsBinaryString ?

                            'binary' : 'array'

                    });

                    //遍历每张表
                    for (let sheet in workbook.Sheets) {
                    
                        if (workbook.Sheets.hasOwnProperty(sheet)) {

                            fromTo = workbook.Sheets[sheet]['!ref'];

                            //每张表导出的数据
                            let xlsxData = XLSX.utils.sheet_to_json(workbook.Sheets[sheet]);

                            console.log(xlsxData);

                            //根据需求 进行数据处理
                            var arr = [];

                            //数据转换为json
                            console.log(JSON.stringify(arr));
                        };

                    };

                }

                reader.readAsBinaryString(f);

            }
        } 
    </script>
</body>

</html>

禁止浏览器回退

//禁止回退
window.location.hash = "no-back";
window.location.hash = "Again-No-back-button";
window.onhashchange = function () { window.location.hash = "no-back"; }

获取iframe中元素的内容

$('#iframe的id').contents().find('要获取的元素').html()

获取路由参数(将hash值转换为对象)

function getUrlParms() {
    var args = new Object();
    var query = location.search.substring(1); //获取查询串   
    var pairs = query.split("&"); //在逗号处断开   
    for (var i = 0; i < pairs.length; i++) {
        var pos = pairs[i].indexOf('='); //查找name=value   
        if (pos == -1) continue; //如果没有找到就跳过   
        var argname = pairs[i].substring(0, pos); //提取name   
        var value = pairs[i].substring(pos + 1); //提取value   
        args[argname] = unescape(value); //存为属性   
    }
    return args;
}

文件下载

原文:传送门

 let a = document.createElement("a");
 a.setAttribute("href", url);
 a.setAttribute("target", "_blank");
 let clickEvent = document.createEvent("MouseEvents");
 clickEvent.initEvent("click", true, true);
 a.dispatchEvent(clickEvent);

判断是否为数字

原文:传送门

Number.isFinite(val)

日期格式转换

/**
 * @description 获取 日期 || 时间  或  传入时间戳 获取转换后得 时间格式
 * @param {String} type 
 * date     2022-11-11 
 * time     12:13:14 
 * dateTime     2022-11-11 12:13:14
 * cdate        2022年11月11日
 * ctime        11时11分11秒
 * cdateTime    2022年11月11日 11时11分11秒
 * y  2022
 * m  12
 * d  12
 * @param {String} timer 时间
 */
export function getTimer(type, timer) {
    if (!['date', 'time', 'dateTime', 'cdate', 'ctime', 'cdateTime', 'y', 'm', 'd'].includes(type)) new Error('getTimer type error');
    const time = timer ? new Date(timer) : new Date();
    var y = time.getFullYear();
    var m = (time.getMonth() + 1).toString().padStart(2, 0);
    var d = time.getDate().toString().padStart(2, 0);
    var h = time.getHours().toString().padStart(2, 0);
    var mm = time.getMinutes().toString().padStart(2, 0);
    var s = time.getSeconds().toString().padStart(2, 0);

    const obj = {
        'y': y,
        'm': m,
        'd': d,
        'date': y + "-" + m + "-" + d,
        'time': h + "-" + mm + "-" + s,
        'dateTime': y + "-" + m + "-" + d + " " + h + ":" + mm + ":" + s,
        'cdate': y + '年' + m + '月' + d + '日',
        'ctime': h + '时' + mm + '分' + s + '秒',
        'cdateTime': y + '年' + m + '月' + d + '日' + " " + h + '时' + mm + '分' + s + '秒'
    }

    return obj[type]
}

时间戳转换时间(x天x小时x分钟x秒)

/**
 * @description 获取 天 小时 分钟 秒
 * @param {String|number} timestamp 时间戳
 * 
 * type 
 * d         天
 * d-h       天-小时
 * d-h-m     天小时分钟
 * d-h-m-s   天-小时-分钟-秒
 * 
 */
export function getTimed(type, timestamp) {
    if (!['d', 'd-h', 'd-h-m', 'd-h-m-s'].includes(type)) new Error('getTimer type error');
    if (!isNumber(Number(timestamp)) || timestamp == 0) return '--'
    var seconds = Math.floor(timestamp / 1000 % 60);
    var minutes = Math.floor(timestamp / 1000 / 60 % 60);
    var hours = Math.floor(timestamp / 1000 / 60 / 60 % 24);
    var days = Math.floor(timestamp / 1000 / 60 / 60 / 24);
    const obj = {
        'd': days + '天',
        'd-h': days + '天' + hours + '小时',
        'd-h-m': days + '天' + hours + '小时' + minutes + '分钟',
        'd-h-m-s': days + '天' + hours + '小时' + minutes + '分钟' + seconds + '秒'
    }
    return obj[type]
}

导出流数据函数

/**
 * @description 导出流数据函数
 * @param data 流 
 * @param {String} fileName 文件名 --- 带后缀
 * @param {String} typeInfo 是否为 image/png true 不是图片 false或不传 是图片
 */
export function exportExcel(data, fileName, typeInfo) {
    const link = document.createElement('a')
    var ext = /\.[^\.]+$/.exec(fileName);
    const blob = new Blob([data], {
        type: typeInfo ? getResponseType(ext[0].split('.')[1]) : 'image/png'
    })
    link.style.display = 'none'
    link.href = URL.createObjectURL(blob)

    link.download = fileName // 下载的文件名
    document.body.appendChild(link)
    link.click()
    document.body.removeChild(link)
}

function getResponseType(ext) {
    var responseType = {
        'abw': 'application/x-abiword',
        'arc': 'application/x-freearc',
        'avi': 'video/x-msvideo',
        'azw': 'application/vnd.amazon.ebook',
        'bin': 'application/octet-stream',
        'bmp': 'image/bmp',
        'bz': 'application/x-bzip',
        'bz2': 'application/x-bzip2',
        'csh': 'application/x-csh',
        'css': 'text/css',
        'csv': 'text/csv',
        'doc': 'application/msword',
        'docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
        'eot': 'application/vnd.ms-fontobject',
        'epub': 'application/epub+zip',
        'gif': 'image/gif',
        'htm': 'text/html',
        'html': 'text/html',
        'ico': 'image/vnd.microsoft.icon',
        'ics': 'text/calendar',
        'jar': 'application/java-archive',
        'jpeg': 'image/jpeg',
        'jpg': 'image/jpeg',
        'js': 'text/javascript',
        'json': 'application/json',
        'jsonld': 'application/ld+json',
        'mid': 'audio/midi audio/x-midi',
        'midi': 'audio/midi audio/x-midi',
        'mjs': 'text/javascript',
        'mp3': 'audio/mpeg',
        'mpeg': 'video/mpeg',
        'mpkg': 'application/vnd.apple.installer+xml',
        'odp': 'application/vnd.oasis.opendocument.presentation',
        'ods': 'application/vnd.oasis.opendocument.spreadsheet',
        'odt': 'application/vnd.oasis.opendocument.text',
        'oga': 'audio/ogg',
        'ogv': 'video/ogg',
        'ogx': 'application/ogg',
        'otf': 'font/otf',
        'png': 'image/png',
        'pdf': 'application/pdf',
        'ppt': 'application/vnd.ms-powerpoint',
        'pptx': 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
        'rar': 'application/x-rar-compressed',
        'rtf': 'application/rtf',
        'sh': 'application/x-sh',
        'svg': 'image/svg+xml',
        'swf': 'application/x-shockwave-flash',
        'tar': 'application/x-tar',
        'gz': 'application/x-tar',
        'tif': 'image/tiff',
        'tiff': 'image/tiff',
        'ttf': 'font/ttf',
        'txt': 'text/plain',
        'vsd': 'application/vnd.visio',
        'wav': 'audio/wav',
        'weba': 'audio/webm',
        'webm': 'video/webm',
        'webp': 'image/webp',
        'woff': 'font/woff',
        'woff2': 'font/woff2',
        'xhtml': 'application/xhtml+xml',
        'xls': 'application/vnd.ms-excel',
        // 'xls':'application/x-xls',
        'xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
        'xml': 'text/xml',
        'xul': 'application/vnd.mozilla.xul+xml',
        'zip': 'application/zip',
        '3gp': 'video/3gpp',
        '3g2': 'video/3gpp2',
        '7z': 'application/x-7z-compressed',
    };
    // if (responseType.hasOwnProperty(ext)) {
    //     console.log('文件类型[' + ext + ']未找到ResponseType');
    //     return ext;
    // }
    return responseType[ext];
}

数组对象去重

let map = new Map();
for (let item of res.data) {
    map.set(item.nodeId, item);
}
let list = [...map.values()]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值