常用的工具函数助力JavaScript高效开发
<h2 data-tool="mdnice编辑器"><img src="https://img2022.cnblogs.com/blog/1161361/202209/1161361-20220908162016078-135762343.png" alt="" loading="lazy"></h2><p> </p>
<p> </p>
<h2 data-tool="mdnice编辑器">前言</h2>
<p data-tool="mdnice编辑器">日常开发中,面对各种不同的需求,我们经常会用到以前开发过的一些工具函数,把这些工具函数收集起来,将大大提高我们的开发效率。</p>
<h2 data-tool="mdnice编辑器">1、校验数据类型</h2>
<pre data-tool="mdnice编辑器"><code>export const typeOf = function(obj) {<br> return Object.prototype.toString.call(obj).slice(8, -1).toLowerCase()<br>}<br><br></code></pre>
<p data-tool="mdnice编辑器"><strong>示例:</strong></p>
<pre data-tool="mdnice编辑器"><code>typeOf('树哥') // string<br>typeOf([]) // array<br>typeOf(new Date()) // date<br>typeOf(null) // null<br>typeOf(true) // boolean<br>typeOf(() => { }) // function<br><br></code></pre>
<h2 data-tool="mdnice编辑器">2、防抖</h2>
<pre data-tool="mdnice编辑器"><code>export const debounce = (() => {<br> let timer = null<br> return (callback, wait = 800) => {<br> timer&&clearTimeout(timer)<br> timer = setTimeout(callback, wait)<br> }<br>})()<br></code></pre>
<p data-tool="mdnice编辑器"><strong>示例:</strong></p>
<p data-tool="mdnice编辑器">如 vue 中使用</p>
<pre data-tool="mdnice编辑器"><code>methods: {<br> loadList() {<br> debounce(() => {<br> console.log('加载数据')<br> }, 500)<br> }<br>}<br></code></pre>
<h2 data-tool="mdnice编辑器">3、节流</h2>
<pre data-tool="mdnice编辑器"><code>export const throttle = (() => {<br> let last = 0<br> return (callback, wait = 800) => {<br> let now = +new Date()<br> if (now - last > wait) {<br> callback()<br> last = now<br> }<br> }<br>})()<br></code></pre>
<h2 data-tool="mdnice编辑器">4、手机号脱敏</h2>
<pre data-tool="mdnice编辑器"><code>export const hideMobile = (mobile) => {<br> return mobile.replace(/^(\d{3})\d{4}(\d{4})$/, "$1****$2")<br>}<br></code></pre>
<h2 data-tool="mdnice编辑器">5、开启全屏</h2>
<pre data-tool="mdnice编辑器"><code>export const launchFullscreen = (element) => {<br> if (element.requestFullscreen) {<br> element.requestFullscreen()<br> } else if (element.mozRequestFullScreen) {<br> element.mozRequestFullScreen()<br> } else if (element.msRequestFullscreen) {<br> element.msRequestFullscreen()<br> } else if (element.webkitRequestFullscreen) {<br> element.webkitRequestFullScreen()<br> }<br>}<br></code></pre>
<h2 data-tool="mdnice编辑器">6、关闭全屏</h2>
<pre data-tool="mdnice编辑器"><code>export const exitFullscreen = () => {<br> if (document.exitFullscreen) {<br> document.exitFullscreen()<br> } else if (document.msExitFullscreen) {<br> document.msExitFullscreen()<br> } else if (document.mozCancelFullScreen) {<br> document.mozCancelFullScreen()<br> } else if (document.webkitExitFullscreen) {<br> document.webkitExitFullscreen()<br> }<br>}<br></code></pre>
<h2 data-tool="mdnice编辑器">7、大小写转换</h2>
<p data-tool="mdnice编辑器"><strong>参数:</strong></p>
<ul class="list-paddingleft-1" data-tool="mdnice编辑器">
<li>str 待转换的字符串</li>
<li>type 1-全大写 2-全小写 3-首字母大写</li>
</ul>
<pre data-tool="mdnice编辑器"><code>export const turnCase = (str, type) => {<br> switch (type) {<br> case 1:<br> return str.toUpperCase()<br> case 2:<br> return str.toLowerCase()<br> case 3:<br> //return str.toUpperCase() + str.substr(1).toLowerCase() // substr 已不推荐使用<br> return str.toUpperCase() + str.substring(1).toLowerCase()<br> default:<br> return str<br> }<br>}<br></code></pre>
<p data-tool="mdnice编辑器"><strong>示例:</strong></p>
<pre data-tool="mdnice编辑器"><code>turnCase('vue', 1) // VUE<br>turnCase('REACT', 2) // react<br>turnCase('vue', 3) // Vue<br></code></pre>
<h2 data-tool="mdnice编辑器">8、解析URL参数</h2>
<pre data-tool="mdnice编辑器"><code>export const getSearchParams = () => {<br> const searchPar = new URLSearchParams(window.location.search)<br> const paramsObj = {}<br> for (const of searchPar.entries()) {<br> paramsObj = value<br> }<br> return paramsObj<br>}<br></code></pre>
<p data-tool="mdnice编辑器"><strong>示例:</strong></p>
<pre data-tool="mdnice编辑器"><code>// 假设目前位于 https://****com/index?id=154513&age=18;<br>getSearchParams(); // {id: "154513", age: "18"}<br></code></pre>
<h2 data-tool="mdnice编辑器">9、判断手机是Andoird还是IOS</h2>
<pre data-tool="mdnice编辑器"><code>/** <br> * 1: ios<br> * 2: android<br> * 3: 其它<br> */<br>export const getOSType=() => {<br> let u = navigator.userAgent, app = navigator.appVersion;<br> let isAndroid = u.indexOf('Android') > -1 || u.indexOf('Linux') > -1;<br> let isIOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/);<br> if (isIOS) {<br> return 1;<br> }<br> if (isAndroid) {<br> return 2;<br> }<br> return 3;<br>}<br></code></pre>
<h2 data-tool="mdnice编辑器">10、数组对象根据字段去重</h2>
<p data-tool="mdnice编辑器"><strong>参数:</strong></p>
<ul class="list-paddingleft-1" data-tool="mdnice编辑器">
<li>arr 要去重的数组</li>
<li>key 根据去重的字段名</li>
</ul>
<pre data-tool="mdnice编辑器"><code>export const uniqueArrayObject = (arr = [], key = 'id') => {<br> if (arr.length === 0) return<br> let list = []<br> const map = {}<br> arr.forEach((item) => {<br> if (!map]) {<br> map] = item<br> }<br> })<br> list = Object.values(map)<br><br> return list<br>}<br></code></pre>
<p data-tool="mdnice编辑器"><strong>示例:</strong></p>
<pre data-tool="mdnice编辑器"><code>const responseList = [<br> { id: 1, name: '树哥' },<br> { id: 2, name: '黄老爷' },<br> { id: 3, name: '张麻子' },<br> { id: 1, name: '黄老爷' },<br> { id: 2, name: '张麻子' },<br> { id: 3, name: '树哥' },<br> { id: 1, name: '树哥' },<br> { id: 2, name: '黄老爷' },<br> { id: 3, name: '张麻子' },<br>]<br><br>uniqueArrayObject(responseList, 'id')<br>// [{ id: 1, name: '树哥' },{ id: 2, name: '黄老爷' },{ id: 3, name: '张麻子' }]<br></code></pre>
<h2 data-tool="mdnice编辑器">11、滚动到页面顶部</h2>
<pre data-tool="mdnice编辑器"><code>export const scrollToTop = () => {<br> const height = document.documentElement.scrollTop || document.body.scrollTop;<br> if (height > 0) {<br> window.requestAnimationFrame(scrollToTop);<br> window.scrollTo(0, height - height / 8);<br> }<br>}<br></code></pre>
<h2 data-tool="mdnice编辑器">12、滚动到元素位置</h2>
<pre data-tool="mdnice编辑器"><code>export const smoothScroll = element =>{<br> document.querySelector(element).scrollIntoView({<br> behavior: 'smooth'<br> });<br>};<br></code></pre>
<p data-tool="mdnice编辑器"><strong>示例:</strong></p>
<pre data-tool="mdnice编辑器"><code>smoothScroll('#target'); // 平滑滚动到 ID 为 target 的元素<br></code></pre>
<h2 data-tool="mdnice编辑器">13、uuid</h2>
<pre data-tool="mdnice编辑器"><code>export const uuid = () => {<br> const temp_url = URL.createObjectURL(new Blob())<br> const uuid = temp_url.toString()<br> URL.revokeObjectURL(temp_url) //释放这个url<br> return uuid.substring(uuid.lastIndexOf('/') + 1)<br>}<br></code></pre>
<p data-tool="mdnice编辑器"><strong>示例:</strong></p>
<pre data-tool="mdnice编辑器"><code>uuid() // a640be34-689f-4b98-be77-e3972f9bffdd<br></code></pre>
<blockquote data-tool="mdnice编辑器">
<p>不过要吐槽一句的是,uuid一般应由后端来进行生成</p>
</blockquote>
<h2 data-tool="mdnice编辑器">14、金额格式化</h2>
<p data-tool="mdnice编辑器"><strong>参数:</strong></p>
<ul class="list-paddingleft-1" data-tool="mdnice编辑器">
<li>{number} number:要格式化的数字</li>
<li>{number} decimals:保留几位小数</li>
<li>{string} dec_point:小数点符号</li>
<li>{string} thousands_sep:千分位符号</li>
</ul>
<pre data-tool="mdnice编辑器"><code>export const moneyFormat = (number, decimals, dec_point, thousands_sep) => {<br> number = (number + '').replace(/[^0-9+-Ee.]/g, '')<br> const n = !isFinite(+number) ? 0 : +number<br> const prec = !isFinite(+decimals) ? 2 : Math.abs(decimals)<br> const sep = typeof thousands_sep === 'undefined' ? ',' : thousands_sep<br> const dec = typeof dec_point === 'undefined' ? '.' : dec_point<br> let s = ''<br> const toFixedFix = function(n, prec) {<br> const k = Math.pow(10, prec)<br> return '' + Math.ceil(n * k) / k<br> }<br> s = (prec ? toFixedFix(n, prec) : '' + Math.round(n)).split('.')<br> const re = /(-?\d+)(\d{3})/<br> while (re.test(s)) {<br> s = s.replace(re, '$1' + sep + '$2')<br> }<br><br> if ((s || '').length < prec) {<br> s = s || ''<br> s += new Array(prec - s.length + 1).join('0')<br> }<br> return s.join(dec)<br>}<br></code></pre>
<p data-tool="mdnice编辑器"><strong>示例:</strong></p>
<pre data-tool="mdnice编辑器"><code>moneyFormat(10000000) // 10,000,000.00<br>moneyFormat(10000000, 3, '.', '-') // 10-000-000.000<br></code></pre>
<h2 data-tool="mdnice编辑器">15、存储操作</h2>
<pre data-tool="mdnice编辑器"><code>class MyCache {<br> constructor(isLocal = true) {<br> this.storage = isLocal ? localStorage : sessionStorage<br> }<br><br> setItem(key, value) {<br> if (typeof (value) === 'object') value = JSON.stringify(value)<br> this.storage.setItem(key, value)<br> }<br><br> getItem(key) {<br> try {<br> return JSON.parse(this.storage.getItem(key))<br> } catch (err) {<br> return this.storage.getItem(key)<br> }<br> }<br><br> removeItem(key) {<br> this.storage.removeItem(key)<br> }<br><br> clear() {<br> this.storage.clear()<br> }<br><br> key(index) {<br> return this.storage.key(index)<br> }<br><br> length() {<br> return this.storage.length<br> }<br>}<br><br>const localCache = new MyCache()<br>const sessionCache = new MyCache(false)<br><br>export { localCache, sessionCache }<br></code></pre>
<p data-tool="mdnice编辑器"><strong>示例:</strong></p>
<pre data-tool="mdnice编辑器"><code>localCache.getItem('user')<br>sessionCache.setItem('name','树哥')<br>sessionCache.getItem('token')<br>localCache.clear()<br></code></pre>
<h2 data-tool="mdnice编辑器">16、下载文件</h2>
<p data-tool="mdnice编辑器"><strong>参数:</strong></p>
<ul class="list-paddingleft-1" data-tool="mdnice编辑器">
<li>api 接口</li>
<li>params 请求参数</li>
<li>fileName 文件名</li>
</ul>
<pre data-tool="mdnice编辑器"><code>const downloadFile = (api, params, fileName, type = 'get') => {<br> axios({<br> method: type,<br> url: api,<br> responseType: 'blob', <br> params: params<br> }).then((res) => {<br> let str = res.headers['content-disposition']<br> if (!res || !str) {<br> return<br> }<br> let suffix = ''<br> // 截取文件名和文件类型<br> if (str.lastIndexOf('.')) {<br> fileName ? '' : fileName = decodeURI(str.substring(str.indexOf('=') + 1, str.lastIndexOf('.')))<br> suffix = str.substring(str.lastIndexOf('.'), str.length)<br> }<br> // 如果支持微软的文件下载方式(ie10+浏览器)<br> if (window.navigator.msSaveBlob) {<br> try {<br> const blobObject = new Blob();<br> window.navigator.msSaveBlob(blobObject, fileName + suffix);<br> } catch (e) {<br> console.log(e);<br> }<br> } else {<br> // 其他浏览器<br> let url = window.URL.createObjectURL(res.data)<br> let link = document.createElement('a')<br> link.style.display = 'none'<br> link.href = url<br> link.setAttribute('download', fileName + suffix)<br> document.body.appendChild(link)<br> link.click()<br> document.body.removeChild(link)<br> window.URL.revokeObjectURL(link.href);<br> }<br> }).catch((err) => {<br> console.log(err.message);<br> })<br>}`<br></code></pre>
<p data-tool="mdnice编辑器"><strong>使用:</strong></p>
<pre data-tool="mdnice编辑器"><code>downloadFile('/api/download', {id}, '文件名')<br></code></pre>
<h2 data-tool="mdnice编辑器">17、时间操作</h2>
<p data-tool="mdnice编辑器">关于时间操作,没必要自己再写一大串代码了,强烈推荐使用 day.js<sup></sup></p>
<blockquote data-tool="mdnice编辑器">
<p>Day.js 是一个仅 2kb 大小的轻量级 JavaScript 时间日期处理库,下载、解析和执行的JavaScript更少,为代码留下更多的时间。</p>
</blockquote>
<h2 data-tool="mdnice编辑器">18、深拷贝</h2>
<pre data-tool="mdnice编辑器"><code>export const clone = parent => {<br> // 判断类型<br> const isType = (obj, type) => {<br> if (typeof obj !== "object") return false;<br> const typeString = Object.prototype.toString.call(obj);<br> let flag;<br> switch (type) {<br> case "Array":<br> flag = typeString === "";<br> break;<br> case "Date":<br> flag = typeString === "";<br> break;<br> case "RegExp":<br> flag = typeString === "";<br> break;<br> default:<br> flag = false;<br> }<br> return flag;<br> };<br><br> // 处理正则<br> const getRegExp = re => {<br> var flags = "";<br> if (re.global) flags += "g";<br> if (re.ignoreCase) flags += "i";<br> if (re.multiline) flags += "m";<br> return flags;<br> };<br> // 维护两个储存循环引用的数组<br> const parents = [];<br> const children = [];<br><br> const _clone = parent => {<br> if (parent === null) return null;<br> if (typeof parent !== "object") return parent;<br><br> let child, proto;<br><br> if (isType(parent, "Array")) {<br> // 对数组做特殊处理<br> child = [];<br> } else if (isType(parent, "RegExp")) {<br> // 对正则对象做特殊处理<br> child = new RegExp(parent.source, getRegExp(parent));<br> if (parent.lastIndex) child.lastIndex = parent.lastIndex;<br> } else if (isType(parent, "Date")) {<br> // 对Date对象做特殊处理<br> child = new Date(parent.getTime());<br> } else {<br> // 处理对象原型<br> proto = Object.getPrototypeOf(parent);<br> // 利用Object.create切断原型链<br> child = Object.create(proto);<br> }<br><br> // 处理循环引用<br> const index = parents.indexOf(parent);<br><br> if (index != -1) {<br> // 如果父数组存在本对象,说明之前已经被引用过,直接返回此对象<br> return children;<br> }<br> parents.push(parent);<br> children.push(child);<br><br> for (let i in parent) {<br> // 递归<br> child = _clone(parent);<br> }<br><br> return child;<br> };<br> return _clone(parent);<br>};<br></code></pre>
<blockquote data-tool="mdnice编辑器">
<p>此方法存在一定局限性:一些特殊情况没有处理: 例如Buffer对象、Promise、Set、Map。</p>
</blockquote>
<p data-tool="mdnice编辑器"><strong>如果确实想要完备的深拷贝,推荐使用 lodash 中的 cloneDeep 方法。</strong></p>
<h2 data-tool="mdnice编辑器">19、模糊搜索</h2>
<p data-tool="mdnice编辑器"><strong>参数:</strong></p>
<ul class="list-paddingleft-1" data-tool="mdnice编辑器">
<li>list 原数组</li>
<li>keyWord 查询的关键词</li>
<li>attribute 数组需要检索属性</li>
</ul>
<pre data-tool="mdnice编辑器"><code>export const fuzzyQuery = (list, keyWord, attribute = 'name') => {<br> const reg = new RegExp(keyWord)<br> const arr = []<br> for (let i = 0; i < list.length; i++) {<br> if (reg.test(list)) {<br> arr.push(list)<br> }<br> }<br> return arr<br>}<br></code></pre>
<p data-tool="mdnice编辑器"><strong>示例:</strong></p>
<pre data-tool="mdnice编辑器"><code>const list = [<br> { id: 1, name: '树哥' },<br> { id: 2, name: '黄老爷' },<br> { id: 3, name: '张麻子' },<br> { id: 4, name: '汤师爷' },<br> { id: 5, name: '胡万' },<br> { id: 6, name: '花姐' },<br> { id: 7, name: '小梅' }<br>]<br>fuzzyQuery(list, '树', 'name') // [{id: 1, name: '树哥'}]<br></code></pre>
<h2 data-tool="mdnice编辑器">20、遍历树节点</h2>
<pre data-tool="mdnice编辑器"><code>export const foreachTree = (data, callback, childrenName = 'children') => {<br> for (let i = 0; i < data.length; i++) {<br> callback(data)<br> if (data && data.length > 0) {<br> foreachTree(data, callback, childrenName)<br> }<br> }<br>}<br></code></pre>
<p data-tool="mdnice编辑器"><strong>示例:</strong></p>
<p data-tool="mdnice编辑器">假设我们要从树状结构数据中查找 id 为 9 的节点</p>
<pre data-tool="mdnice编辑器"><code>const treeData = [{<br> id: 1,<br> label: '一级 1',<br> children: [{<br> id: 4,<br> label: '二级 1-1',<br> children: [{<br> id: 9,<br> label: '三级 1-1-1'<br> }, {<br> id: 10,<br> label: '三级 1-1-2'<br> }]<br> }]<br> }, {<br> id: 2,<br> label: '一级 2',<br> children: [{<br> id: 5,<br> label: '二级 2-1'<br> }, {<br> id: 6,<br> label: '二级 2-2'<br> }]<br> }, {<br> id: 3,<br> label: '一级 3',<br> children: [{<br> id: 7,<br> label: '二级 3-1'<br> }, {<br> id: 8,<br> label: '二级 3-2'<br> }]<br>}],<br><br>let result<br>foreachTree(data, (item) => {<br> if (item.id === 9) {<br> result = item<br> }<br>})<br>console.log('result', result) // {id: 9,label: "三级 1-1-1"} <br></code></pre>
<p data-tool="mdnice编辑器"> </p>
</div>
<div id="MySignature" role="contentinfo">
<p>本文来自博客园,作者:喆星高照,转载请注明原文链接:https://www.cnblogs.com/houxianzhou/p/16669842.html</p><br><br>
来源:https://www.cnblogs.com/houxianzhou/p/16669842.html
頁:
[1]