JavaScript 工具函数(分享)

文章目录

      • 1. 任意区间的的随机数
      • 2. 判断一个数是不是质数
      • 3. 传入指定 key 返回当前页面 search 的 value,也可以手动传入url
      • 4. 在 Date 上封装了一个返回指定格式的方法
      • 5. 数组去重
      • 6. 预览pdf,后端返回的文件流设置的只能下载,需要预览
      • 7. 下载pdf,后端返回的文件流,需要下载
      • 8. 为元素添加拖拽功能,通过 transform 改变的位置
      • 9. 树结构转数组,通过id和pid关联
      • 10. 通过 pid 和 id 关联的数组转树结构
      • 11. 数组对象数据过滤,两个一维数组如果存在相同id则替换指定字段,如果不同则添加
      • 12. 进度转百分比
      • 13. 时间对象转天数
      • 14. 天数转时间对象
      • 15. 计算两个时间戳相差多少天
      • 16. 获取当月天数
      • 17. 随机生成 16 进制颜色
      • 18. 控制异步并发数

1. 任意区间的的随机数

/*** 任意区间的的随机数* @param {Number} max 最大值* @param {Number} min 最小值* @returns {Number}*/
const getRandom = (max, min) => Math.floor(Math.random() * (max - min + 1) + min);

2. 判断一个数是不是质数

/*** 判断一个数是不是质数* @param {Number} num* @returns {Boolean} true:是质数、false:不是质数*/
function isPrime(num) {let temp = Math.floor(Math.sqrt(num));for (let i = 2; i <= temp; i++) {if (num % i == 0) {return false;}}return true;
}

3. 传入指定 key 返回当前页面 search 的 value,也可以手动传入url

/*** 传入指定 key 返回当前页面 search 的 value,也可以手动传入url* @param {Number} key* @param {String} url* @returns {String}*/
function getSearch(key, url = "") {let search = url.split("?")[1] || location.search.substring(1);let obj = {};search.split("&").forEach((item) => {let temp = item.split("=");obj[temp[0]] = temp[1];});return obj[key];
}

4. 在 Date 上封装了一个返回指定格式的方法

/*** 在 Date 上封装了一个返回指定格式的方法* @param {String | Number} type 需要分割的类型,需要传入字符,0 为特殊类型(年月日)* @param {Number} date 时间戳* @returns {String}*/
Date.format = function (type = "-", date) {date = date && new Date(date);let time = date || new this();let y = time.getFullYear();let M = time.getMonth() + 1;let d = time.getDate();let h = time.getHours();let m = time.getMinutes();let s = time.getSeconds();M = M > 9 ? M : "0" + M;d = d > 9 ? d : "0" + d;h = h > 9 ? h : "0" + h;m = m > 9 ? m : "0" + m;s = s > 9 ? s : "0" + s;if (type === 0) {return `${y}${M}${d}${h}${m}${s}`;}return `${y}${type}${M}${type}${d} ${h}${type}${m}${type}${s}`;
};

5. 数组去重

/*** 数组去重* @param {Array} arr* @returns {Array}*/
const toRepeat = (arr) => [...new Set(arr)];

6. 预览pdf,后端返回的文件流设置的只能下载,需要预览

/*** 预览Pdf,后端返回的文件流设置的只能下载,需要预览* @param {String} url*/
function previewPdf(url) {$.ajax({cache: true,type: "GET",url, //pdf文件流的请求接口async: false,mimeType: "text/plain; charset=x-user-defined", //jq ajax请求文件流的方式  (起作用的重点)success(data) {var rawLength = data.length;var array = new Uint8Array(new ArrayBuffer(rawLength));for (let i = 0; i < rawLength; i++) {array[i] = data.charCodeAt(i) & 0xff;}//上面是把后台请求到的文件流进行转化为符合的流var blob = new Blob([array], { type: "application/pdf;charset-UTF-8" });var href = URL.createObjectURL(blob);open(href);URL.revokeObjectURL(href);},error() {alert("网络原因请求失败!");},});
}

7. 下载pdf,后端返回的文件流,需要下载

/*** 下载Pdf,后端返回的文件流,需要下载* @param {String} url*/
function downloadPdf(url) {$.ajax({type: "POST",url,headers: {"Content-Type": "application/json",},// 其他类型需要设置 responseType 指定响应的数据类型,默认为jsonxhrFields: { responseType: "blob" },data: JSON.stringify({ projectId: null }),success: (res) => {const blob = new Blob([res], {type: "application/pdf",});let a = document.createElement("a");a.download = "demo.pdf";a.href = URL.createObjectURL(blob);a.click();URL.revokeObjectURL(href);},error() {alert("网络原因请求失败!");},});
}

8. 为元素添加拖拽功能,通过 transform 改变的位置

/*** 为元素添加拖拽功能,通过transform改变的位置* @param {Element} el*/
function elDrag(el) {let initX = null;let initY = null;el.style.cursor = "move"; //设置鼠标样式为移动// 获取初始点击的位置el.addEventListener("mousedown", function (e) {// 获取盒子距离可视宽度的距离let curX = 0;let curY = 0;let str = el.style.transform.trim();if (str) {let reg = /\-?\d+/g;curX = Number(reg.exec(str));curY = Number(reg.exec(str));}initX = e.pageX - curX;initY = e.pageY - curY;// 鼠标移动事件设置移动位置document.addEventListener("mousemove", moveEle);});// 设置当前位置function moveEle(e) {let x = e.pageX - initX;let y = e.pageY - initY;el.style.transform = `translate(${x}px,${y}px)`;}// 鼠标松开移出方法document.addEventListener("mouseup", function () {document.removeEventListener("mousemove", moveEle);});
}

9. 树结构转数组,通过id和pid关联

/*** 树结构转数组,通过id和pid关联* @param {Array} tree 树结构数组* @param {String} child 存放子元素的字段,默认为 children* @returns {Array}*/
function treeToArr(tree, child = "children") {let arr = JSON.parse(JSON.stringify(tree));while (arr.some((i) => i.hasOwnProperty(child))) {arr.forEach((item) => {// 如果最开始没有 pid 表示为第一层if (!item.hasOwnProperty("pid")) item.pid = "-1";if (item[child] && item[child].length) {arr.push(...item[child].map((i) => ({ ...i, pid: item.id })));}delete item[child];});}return arr;
}

10. 通过 pid 和 id 关联的数组转树结构

/*** 通过 pid 和 id 关联的数组转树结构* @param {Array} arr 数组* @param {String} child 存放子元素的字段,默认为 children* @returns {Array}*/
function arrToTree(arr, child = "children") {let tree = JSON.parse(JSON.stringify(arr));tree.forEach((item) => {// 通过 pid 和 id 关联添加子节点属性item[child] = tree.filter((i) => i.pid === item.id);// 移除已关联的节点,由于filter是浅拷贝,所以并不会导致数据丢失tree = tree.filter((i) => i.pid !== item.id);});return tree;
}/*** 通过 pid 和 id 关联的数组转树结构2* @param {Array} arr 数组* @param {String} child 存放子元素的字段,默认为 children* @param {String} rootId 根节点id* @returns {Array}*/
function arrToTree2(arr, child = "children", rootId = "-1") {let result = JSON.parse(JSON.stringify(arr));return result.reduce((pre, cur, i, arr) => {cur[child] = arr.filter((item) => item.pid === cur.id);if (cur.pid === rootId) {pre.push(cur);}return pre;}, []);
}

11. 数组对象数据过滤,两个一维数组如果存在相同id则替换指定字段,如果不同则添加

/*** 数组对象数据过滤,两个一维数组如果存在相同id则替换指定字段,如果不同则添加* @param {Array} target 数组1* @param {Array} source 数组2* @returns {Array}*/
function dateReplace(target, source) {let arr1 = JSON.parse(JSON.stringify(target));let arr2 = JSON.parse(JSON.stringify(source));arr1.forEach((item) => {arr2.find((i) => {if (item.id === i.id) {// 除了id全部替换过去for (let k in i) {if (k !== "id") {item[k] = i[k];}}// 已经替换过的打个标记,合并的时候不要了i.replace = true;}});});return [...arr1, ...arr2.filter((item) => !item.replace)];
}

12. 进度转百分比

/*** 进度转百分比* @param {Number} progress  0 ~ 1* @param {Number} type      0:0、1 ==> 0%、100%,1:0、1 ==> 未开始、已完成* @returns {Number}         0% ~ 100%*/
const stepsToRatio = (progress, type = 0) => {if (progress === null) progress = Number(progress);if (typeof progress !== "number") throw new Error("只能识别数字类型");if (type === 1) {return progress === 0 ? "未开始" : "已完成";}return Math.floor(progress * 100) + "%";
};

13. 时间对象转天数

/*** 时间对象转天数* @param {Date} time 时间对象* @returns {Number} 天数*/
const dateToDay = (time) => +new Date(time) / (1000 * 3600 * 24);

14. 天数转时间对象

/*** 天数转时间对象* @param {Number} day 天数* @returns {Date} 时间对象*/
const dayToDate = (day) => new Date(day * (1000 * 3600 * 24));

15. 计算两个时间戳相差多少天

/*** 计算两个时间戳相差多少天* @param {Number | Date | String} startTime 开始时间,时间戳 | 时间对象 | 字符串表示的时间格式("2022-1-1 8:00:00")* @param {Number | Date | String} endTime 结束时间* @returns {Number} 相差天数*/
const daysInterval = (startTime, endTime) => Math.abs(Math.round((+new Date(endTime) - +new Date(startTime)) / (1000 * 3600 * 24)));

16. 获取当月天数

/*** 获取当月天数* @returns {Number} 当月天数*/
function getDays() {let date = new Date();date.setMonth(date.getMonth() + 1);date.setDate(0);return date.getDate();
}

17. 随机生成 16 进制颜色

/*** 随机生成 16 进制颜色* @returns {String} 颜色*/
function randomHexcolor() {return "#" + Math.random().toString("16").substring(2, 8);
}

18. 控制异步并发数

/*** 控制异步并发数*/
class SuperTask {// concurrency:并发数量constructor(concurrency = 2) {this.concurrency = concurrency;this.queueCount = 0;this.tasks = [];}// 添加任务与时间addTask(cb, time, resCb) {this._add(() => this._timeout(time).then(cb), resCb);}// 三个辅助函数_add(task, resCb) {this.tasks.push({task,resCb,});this._run();}async _run() {while (this.queueCount < this.concurrency && this.tasks.length) {let { task, resCb } = this.tasks.shift();this.queueCount++;let res = await task();resCb && resCb(res);this.queueCount--;this._run();}}_timeout(time) {return new Promise((resolve, reject) => {setTimeout(() => {resolve();}, time);});}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/11261.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

速盾:jquery是用cdn快,还是保存本地快?

在讨论jQuery是使用CDN快还是保存本地快之前&#xff0c;我们先来了解一下jQuery是什么。 jQuery是一种流行的JavaScript库&#xff0c;它极大地简化了JavaScript编程&#xff0c;使得开发者能够更轻松地操作HTML文档、处理事件、实现动画效果以及处理AJAX请求。由于其简单易用…

Spring:Spring Boot常用注解大全

Spring Boot是一个由Pivotal团队提供的全新框架&#xff0c;其设计目的是用来简化新Spring应用的初始搭建以及开发过程。以下是对Spring Boot的详细介绍&#xff1a; 一、发展沿革   2013年&#xff0c;Pivotal团队开始研发Spring Boot。   2014年4月&#xff0c;发布了全…

各渠道应用推广点击上报文档地址

小米点击上报&#xff1a;https://api.e.mi.com/doc.html#/1.0.0-mdtag9b26f-omd/document-2bd1c4c260259b072818205a8ae20139 荣耀点击上报&#xff1a;https://ads.honor.com/help/1738095811504373761

python print用

Python中的print()函数是最常用的一个内置函数&#xff0c;用来向标准输出设备&#xff08;通常是屏幕&#xff09;发送文本或其他类型的对象。从Python初学者到高级开发人员&#xff0c;print()函数是编写程序时不可或缺的一个工具。本文旨在深入探讨print()函数的不同用法和技…

[每周一更]-(第96期):Rsync 用法教程:高效同步文件与目录

文章目录 一、引言二、rsync 基本概念三、介绍rsync 是什么&#xff1f;四、安装五、rsync 基本语法常见示例&#xff08;默认ssh协议&#xff09;&#xff1a; 六、常用选项1. -a 或 --archive2. -v 或 --verbose3. -z 或 --compress4. --delete5. --exclude6. --exclude-from…

vue项目中vue.config.js中配置webpack详解

前言&#xff1a; vue-cli3以前的版本中把webpack的配置都写在config文件中&#xff0c;可以vue-cli3以上的版本中没有了config目录&#xff0c;可以将配置webpack的文件写在vue.config.js文件里面。 vue.config.js 是一个可选的配置文件&#xff0c;如果项目的 (和 package.…

hadoop yarm你知道吗?

一、概念 Hadoop YARN&#xff08;Yet Another Resource Negotiator&#xff09;是Hadoop 2.x版本中的一个重要组件&#xff0c;用于资源管理和作业调度。它是Hadoop的第二代资源管理器&#xff0c;取代了Hadoop 1.x版本中的MapReduce作业调度器。 通俗地理解它的作用有点像一…

如何通过外网访问内网服务器?

随着网络的普及和各行各业对互联网的应用需求增加&#xff0c;通过外网访问内网服务器的需求也越来越多。在传统的网络环境下&#xff0c;要实现外网访问内网服务器需要进行繁琐的端口映射设置&#xff0c;而且还会受到网络环境限制和数据安全问题的困扰。现在有了一种名为【天…

Springboot整合 Spring Cloud Alibaba Sentinel

1.Sentinel介绍 官方文档地址&#xff1a; https://sentinelguard.io/zh-cn/docs/introduction.html https://github.com/alibaba/Sentinel/wiki/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件&#xff0c;主要以流量为切入…

定制聚四氟乙烯大圆桶50L

PTFE聚四氟乙烯圆桶是高性能化学实验器皿&#xff0c;适用于强酸强碱环境。具有化学稳定性、耐高温、良好密封、易清洗、环保安全等特点。 常规四氟桶-超大规格四氟桶均可定制&#xff0c;一体成型&#xff0c;保证密封&#xff0c;可长期保存高纯试剂。 产品特性 1.超纯实验…

Elastic 基于 RAG 的 AI 助手:利用 LLM 和私有 GitHub 问题分析应用程序问题

作者&#xff1a;来自 Elastic Bahubali Shetti 作为 SRE&#xff0c;分析应用程序比以往更加复杂。 你不仅必须确保应用程序以最佳状态运行以确保良好的客户体验&#xff0c;而且还必须了解某些情况下的内部工作原理以帮助排除故障。 分析基于生产的服务中的问题是一项团队运动…

python项目中exec路径处理

理解Python中的exec()函数及其参数 在Python编程中&#xff0c;exec()函数是一个强大的工具&#xff0c;它允许动态地执行存储在字符串或代码对象中的Python代码。然而&#xff0c;由于其能力强大&#xff0c;exec()的使用也需要谨慎&#xff0c;以避免潜在的安全风险。本文将…

C#:输出任意一个数的逆序数

任务描述 本关任务&#xff1a;从键盘输入一个整数&#xff0c;输出该数的逆序数。如369的逆序数是963,478的逆序数是874 编程要求 根据提示&#xff0c;在右侧编辑器补充代码&#xff0c;计算并输出一个数的逆序数。 测试说明 平台会对你编写的代码进行测试&#xff1a; 测…

回炉重造java----多线程

概念 注&#xff1a; main方法其实也是一个线程。在java中所以的线程都是同时启动的&#xff0c;至于什么时候&#xff0c;哪个先执行&#xff0c;完全看谁先得到CPU的资源。在java中&#xff0c;每次程序运行至少启动2个线程。一个是main线程&#xff0c;一个是垃圾收集(gc )线…

【Ubuntu】apt命令安装最新版本Nginx

目录 环境前言添加Nginx仓库步骤1、仓库公钥2、文本公钥转二进制GPG公钥&#xff08;可选&#xff09;3、添加apt软件源4、安装新版Nginx 参阅 环境 Ubuntu 22.04 前言 ubuntu官方apt软件仓库&#xff08;或者叫软件源&#xff09;的软件版本可能会比较旧&#xff0c;导致无…

AI算法-高数5-线性代数1-基本概念、向量

线性代数&#xff1a;主要研究1、张量>CV计算机视觉 2、研究张量的线性关系。 深度学习的表现之所以能够超过传统的机器学习算法离不开神经网络&#xff0c;然而神经网络最基本的数据结构就是向量和矩阵&#xff0c;神经网络的输入是向量&#xff0c;然后通过每个矩阵对向量…

使用 Flask Blueprint 实现模块化 Web 应用

文章目录 1. 什么是 Flask Blueprint&#xff1f;2. 为什么要使用 Flask Blueprint&#xff1f;3. 如何使用 Flask Blueprint&#xff1f;4. 在 Blueprint 之间进行通信5. 结合 Flask 插件系统进行功能拓展结语 当构建大型 Flask Web 应用时&#xff0c;保持代码的组织结构清晰…

遨游 JavaScript 对象星际:探索面向对象编程的深邃世界

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;JavaScript 精粹 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 &#x1f4af;面向对象编程&#x1f517;1 什么是对象&#x1f517;2 什么是…

免费SSL证书申请安装通用指南

JoySSL官网 注册码230918 关于SSL证书的申请与安装&#xff0c;以下是一个概括性的技术性指南&#xff0c;适合那些希望详细了解该过程的技术人员或网站管理员。请注意&#xff0c;具体步骤可能会根据证书颁发机构(CA)和服务提供商的不同而有所变化。 一、选择SSL证书类型与颁…

Lua 基础 01 入门

Lua 基础相关知识 第一期 注释 -- 单行注释--[[多行注释 --]]-- 多加一个横杠符号就能重新启用注释内的代码 ---[[print("Lua") --]]数据类型 Lua 是动态类型语言&#xff0c;变量不需要类型定义&#xff0c;只需要为变量赋值。 Lua 有 8 种基本类型&#xff1a…