前端開發有時會處理一部分後臺返回的數據,或者根據數據判斷作一些處理; 這個時候就很是有必要將一些經常使用的工具類封裝起來;
本文根據經常使用的一些工具類封裝了 59 個方法,固然還有不少用的較少前期沒有錄入,後期持續跟新;
源碼地址,utils-lan 源碼地址,歡迎 star!前端
1.方法一vue
npm i -S utils-lan import utils from 'utils-lan' console.log(utils.arrJudge(['1','2']))
2.方法二
git clone utils-lan 源碼地址下來導入項目; react
3.關於類名
是根據字面量來命名的,方法首個駝峯表示所屬類型,後面是方法做用
如 arrAndSet 一看就是數組的方法,是處理交集的;
若是實在難以忍受,能夠採用方法 2,導入本地對項目進行更改.
給你們推薦一款 bug 管理工具,請戳
bug 管理工具android
並集ios
/** * 數組並集,只支持一維數組 * @param {Array} arrOne * @param {Array} arrTwo */ export const arrAndSet = (arrOne, arrTwo) => { return arrOne.concat(arrTwo.filter(v => !arrOne.includes(v))) }
交集git
/** * 數組交集,只支持一維數組 * @param {Array} arrOne * @param {Array} arrTwo */ export const arrIntersection = (arrOne, arrTwo) => { return arrOne.filter(v => arrTwo.includes(v)) }
差集github
/** * 數組差集,只支持一維數組 * @param {Array} arrOne * @param {Array} arrTwo * eg: [1, 2, 3] [2, 4, 5] 差集爲[1,3,4,5] */ export const arrDifference = (arrOne, arrTwo) => { return arrOne.concat(arrTwo).filter(v => !arrOne.includes(v) || !arrTwo.includes(v)) }
兩個數組合併成一個數組對象web
/** * 兩個數組合併成一個對象數組,考慮到複雜度,因此目前支持兩個一維數組 * @param {Array} arrOne * @param {Array} arrTwo * @param {oneKey} oneKey 選填,若是兩個都未傳,直接以 arrOne 的值做爲 key,arrTwo 做爲 value * @param {twoKey} twoKey */ export const arrTwoToArrObj = (arrOne, arrTwo, oneKey, twoKey) => { if(!oneKey&&!twoKey){ return arrOne.map((oneKey, i) => ({ [oneKey]:arrTwo[i] })) }else{ return arrOne.map((oneKey, i) => ({ oneKey, twoKey: arrTwo[i] })) } }
數組對象求和npm
/** * 數組對象求和 * @param {Object} arrObj 數組對象 * @param {String} key 數組對應的 key 值 */ export const arrObjSum = (obj, key) => { return arrObj.reduce((prev, cur) => prev + cur.key, 0) }
數組合並api
/** * 數組合並,目前合併一維 * @param {Array} arrOne 數組 * @param {Array} arrTwo 數組 */ export const arrConcat = (arrOne, arrTwo) => { return [...arrOne, ...arrTwo] }
數組求和
/** * 數組求和 * @param {Array} arr 數組 */ export const arrSum = arr => { return arr.reduce((prev, cur)=> { return prev + cur }, 0) }
數組是否包含某值
/** * 數組是否包含某值 * @param {Array} arr 數組 * @param {} value 值,目前只支持 String,Number,Boolean */ export const arrIncludeValue = (arr, value) => { return arr.includes( value) }
數組最大值
/** * 數組最大值 * @param {Array} arr 數組 */ export const arrMax = arr => { return Math.max(...arr) }
數組去重
/** * 數組去重 * @param {Array} arr 數組 */ export const arrRemoveRepeat = arr => { return Array.from(new Set(arr)) }
數組排序
/** * 數組排序 * @param {Array} arr 數組 * @param {Boolean} ascendFlag 升序,默認爲 true */ export const arrOrderAscend = (arr, ascendFlag=true) => { return arr.sort((a, b) => { return ascendFlag ? a - b : b - a }) }
判斷是不是數組
/** * 判斷是不是數組 * @param {Array}} arr 數組 */ export const arrJudge = arr => { if (Array.isArray(arr)) { return true } }
判斷是不是數字
/** * 判斷是不是數字 * @param {Number} data */ export const checkNum = data => { const reg = /^\d{1,}$/g if (reg.test(data)) return true }
判斷是不是字母
/** * 判斷是不是字母 * @param {Number} data */ export const checkLetter = data => { const reg = /^[a-zA-Z]+$/g if (reg.test(data)) return true }
判斷是否所有是小寫字母
/** * 判斷是否所有是小寫字母 * @param {Number} data */ export const checkLowercaseLetter = data => { const reg = /^[a-z]+$/g if (reg.test(data)) return true }
判斷是不是大寫字母
/** * 判斷是不是大寫字母 * @param {Number} data */ export const checkCapitalLetter = data => { const reg = /^[A-Z]+$/g if (reg.test(data)) return true }
判斷是不是字母或數字
/** * 判斷是不是字母或數字 * @param {Number || String} data 字符或數字 */ export const checkNumOrLetter = data => { const reg = /^[0-9a-zA-Z]*$/g if (reg.test(data)) return true }
判斷是不是中文
/** * 判斷是不是中文 * @param {String} data 中文 */ export const checkChinese = data => { const reg = /^[\u4E00-\u9FA5]+$/g if (reg.test(data)) return true }
判斷是不是中文,數字或字母
export const checkChineseNumberLettter = data => { const reg = /^[a-zA-Z0-9\u4e00-\u9fa5]+$/g if (reg.test(data)) return true }
判斷是不是郵箱地址
/** * 判斷是不是郵箱地址 * @param {String} data */ export const checkEmail = data => { const reg = /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/g if (reg.test(data)) return true }
判斷是不是手機號
/** * 判斷是不是手機號,只要是13,14,15,16,17,18,19開頭便可 * @param {String} data */ export const checkTelphone = data => { const reg = /^((\+|00)86)?1[3-9]\d{9}$/g if (reg.test(data)) return true }
判斷是不是正確的網址
/** * 判斷是不是正確的網址 * @param {String} url 網址 */ export const checkUrl = url => { const a = document.createElement('a') a.href = url return [ /^(http|https):$/.test(a.protocol), a.host, a.pathname !== url, a.pathname !== `/${url}` ].find(x => !x) === undefined }
/** * 判斷是瀏覽器內核 */ export const checkBrowser = () => { const u = navigator.userAgent; const obj = { trident: u.indexOf("Trident") > -1, //IE內核 presto: u.indexOf("Presto") > -1, //opera內核 webKit: u.indexOf("AppleWebKit") > -1, //蘋果、谷歌內核 gecko: u.indexOf("Gecko") > -1 && u.indexOf("KHTML") == -1, //火狐內核 } return Object.keys(obj)[Object.values(obj).indexOf(true)] };
判斷是終端類型,值有ios,android,iPad
/** * 判斷是終端類型,值有ios,android,iPad */ export const checkIosAndroidIpad = () => { const u = navigator.userAgent; const obj = { ios: !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), //ios終端 android: u.indexOf("Android") > -1 || u.indexOf("Linux") > -1, //android終端或者uc瀏覽器 iPad: u.indexOf("iPad") > -1, //是否iPad } return Object.keys(obj)[Object.values(obj).indexOf(true)] };
判斷是不是微信,qq 或 uc
/** * 判斷是不是微信,qq 或 uc */ export const checkWeixinQqUc = () => { const u = navigator.userAgent; const obj = { weixin: u.indexOf("MicroMessenger") > -1, //是否微信 qq: u.match(/QQ/i) == "qq"&&!u.indexOf('MQQBrowser') > -1, //是否QQ uc: u.indexOf('UCBrowser') > -1 } return Object.keys(obj)[Object.values(obj).indexOf(true)] };
檢查是不是 IphoneX
/** * 檢查是不是 IphoneX */ export const checkIsIphoneX = () => { const u = navigator.userAgent; const isIOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); if (isIOS && screen.height >= 812) { return true; } };
格式化文件單位
/** * 格式化文件單位 * @param {String || Number} size 文件大小(kb) */ export const fileFormatSize = size => { var i var unit = ['B', 'KB', 'MB', 'GB', 'TB', 'PB'] for (i = 0; i < unit.length && size >= 1024; i++) { size /= 1024 } return (Math.round(size * 100) / 100 || 0) + unit[i] }
判斷兩個對象是否相等,目前只支持對象值爲簡單數據類型的判斷
/** * 判斷兩個對象是否相等,目前只支持對象值爲簡單數據類型的判斷 * @param {Object} oneObj 對象 * @param {Object} twoObj 對象 */ export const objIsEqual = (oneObj, twoObj) => { return JSON.stringify(oneObj) === JSON.stringify(twoObj) }
對象深度克隆;
1.JSON.stringify深度克隆對象;
2.沒法對函數 、RegExp等特殊對象的克隆;
3.會拋棄對象的constructor,全部的構造函數會指向Object;
4.對象有循環引用,會報錯
/** * 對象深度克隆, * JSON.stringify深度克隆對象 * 沒法對函數 、RegExp等特殊對象的克隆, * 會拋棄對象的constructor,全部的構造函數會指向Object * 對象有循環引用,會報錯 * @param {Object} obj 克隆的對象 */ export const objDeepClone = obj => { return clone(obj) } const isType = (obj, type) => { if (typeof obj !== 'object') return false; // 判斷數據類型的經典方法: const typeString = Object.prototype.toString.call(obj); let flag; switch (type) { case 'Array': flag = typeString === '[object Array]'; break; case 'Date': flag = typeString === '[object Date]'; break; case 'RegExp': flag = typeString === '[object RegExp]'; break; default: flag = false; } return flag; }; /** * deep clone * @param {[type]} parent object 須要進行克隆的對象 * @return {[type]} 深克隆後的對象 */ const clone = parent => { // 維護兩個儲存循環引用的數組 const parents = [] const children = [] const _clone = parent => { if (parent === null) return null if (typeof parent !== 'object') return parent let child, proto if (isType(parent, 'Array')) { // 對數組作特殊處理 child = [] } else if (isType(parent, 'RegExp')) { // 對正則對象作特殊處理 child = new RegExp(parent.source, getRegExp(parent)) if (parent.lastIndex) child.lastIndex = parent.lastIndex } else if (isType(parent, 'Date')) { // 對Date對象作特殊處理 child = new Date(parent.getTime()) } else { // 處理對象原型 proto = Object.getPrototypeOf(parent) // 利用Object.create切斷原型鏈 child = Object.create(proto) } // 處理循環引用 const index = parents.indexOf(parent) if (index !== -1) { // 若是父數組存在本對象,說明以前已經被引用過,直接返回此對象 return children[index] } parents.push(parent) children.push(child) for (const i in parent) { // 遞歸 child[i] = _clone(parent[i]) } return child } return _clone(parent) }
localStorage 存貯
目前對象值若是是函數 、RegExp等特殊對象存貯會被忽略
/** * localStorage 存貯 * 目前對象值若是是函數 、RegExp等特殊對象存貯會被忽略 * @param {String} key 屬性 * @param {Object} value 值 */ export const localStorageSet = (key, value) => { if (typeof (value) === 'object') value = JSON.stringify(value) localStorage.setItem(key, value) }
localStorage 獲取
/** * localStorage 獲取 * @param {String} key 屬性 */ export const localStorageGet = (key) => { return JSON.parse(localStorage.getItem(key)) }
localStorage 移除
/** * localStorage 移除 * @param {String} key 屬性 */ export const localStorageRemove = (key) => { localStorage.removeItem(key) }
localStorage 存貯某一段時間失效
/** * localStorage 存貯某一段時間失效 * @param {String} key 屬性 * @param {*} value 存貯值 * @param {String} expire 過時時間,毫秒數 */ export const localStorageSetExpire = (key, value, expire) => { if (typeof (value) === 'object') value = JSON.stringify(value) localStorage.setItem(key, value) setTimeout(() => { localStorage.removeItem(key) }, expire) }
sessionStorage 存貯
/** * sessionStorage 存貯 * @param {String} key 屬性 * @param {*} value 值 */ export const sessionStorageSet = (key, value) => { if (typeof (value) === 'object') value = JSON.stringify(value) sessionStorage.setItem(key, value) }
sessionStorage 獲取
/** * sessionStorage 獲取 * @param {String} key 屬性 */ export const sessionStorageGet = (key) => { return JSON.parse(sessionStorage.getItem(key)) }
sessionStorage 刪除
/** * sessionStorage 刪除 * @param {String} key 屬性 */ export const sessionStorageRemove = (key, value) => { sessionStorage.removeItem(key, value) }
sessionStorage 存貯某一段時間失效
/** * sessionStorage 存貯某一段時間失效 * @param {String} key 屬性 * @param {*} value 存貯值 * @param {String} expire 過時時間,毫秒數 */ export const sessionStorageSetExpire = (key, value, expire) => { if (typeof (value) === 'object') value = JSON.stringify(value) sessionStorage.setItem(key, value) setTimeout(() => { sessionStorage.removeItem(key) }, expire) }
cookie 存貯
/** * cookie 存貯 * @param {String} key 屬性 * @param {*} value 值 * @param String expire 過時時間,單位天 */ export const cookieSet = (key, value, expire) => { const d = new Date() d.setDate(d.getDate() + expire) document.cookie = `${key}=${value};expires=${d.toGMTString()}` }
cookie 獲取
/** * cookie 獲取 * @param {String} key 屬性 */ export const cookieGet = (key) => { const cookieStr = unescape(document.cookie) const arr = cookieStr.split('; ') let cookieValue = '' for (var i = 0; i < arr.length; i++) { const temp = arr[i].split('=') if (temp[0] === key) { cookieValue = temp[1] break } } return cookieValue }
cookie 刪除
/** * cookie 刪除 * @param {String} key 屬性 */ export const cookieRemove = (key) => { document.cookie = `${encodeURIComponent(key)}=;expires=${new Date()}` }
去掉字符左右空格
/** * 去掉字符左右空格 * @param {String} str 字符 */ export const strTrimLeftOrRight = str => { return str.replace(/(^\s*)|(\s*$)/g, "") }
判斷字符是否包含某值
/** * 判斷字符是否包含某值 * @param {String} str 字符 * @param {String} value 字符 */ export const strInclude = (str, value) => { return str.includes(value) }
判斷字符是否以某個字符開頭
/** * 判斷字符是否以某個字符開頭 * @param {String} str 字符 * @param {String} value 字符 */ export const strBeginWith = (str, value) => { return str.indexOf(value) === 0 }
全局替換某個字符爲另外一個字符
/** * 全局替換某個字符爲另外一個字符 * @param {String} str 字符 * @param {String} valueOne 包含的字符 * @param {String} valueTwo 要替換的字符,選填 */ export const strReplace = (str, valueOne, valueTwo) => { return str.replace(new RegExp(valueOne,'g'), valueTwo) }
將字母所有轉化成大寫
/** * 將字母所有轉化成大寫 * @param {String} str 字符 */ export const strToCapital = (str) => { return str.toUpperCase() }
將字母所有轉化成小寫
/** * 將字母所有轉化成小寫 * @param {String} str 字符 */ export const strToLowercase = (str) => { return str.toLowerCase() }
將字母所有轉化成以大寫開頭
/** * 將字母所有轉化成以大寫開頭 * @param {String} str 字符 */ export const strToCapitalLetter = (str) => { const strOne = str.toLowerCase() return strOne.charAt(0).toUpperCase() + strOne.slice(1) }
節流
/** * 節流 * @param {*} func 執行函數 * @param {*} delay 節流時間,毫秒 */ export const throttle = function(func, delay) { let timer = null return function() { if (!timer) { timer = setTimeout(() => { func.apply(this, arguments) // 或者直接 func() timer = null }, delay) } } }
防抖
/** * 防抖 * @param {*} fn 執行函數 * @param {*} wait 防抖時間,毫秒 */ export const debounce = function(fn, wait) { let timeout = null return function() { if (timeout !== null) clearTimeout(timeout)// 若是屢次觸發將上次記錄延遲清除掉 timeout = setTimeout(() => { fn.apply(this, arguments) // 或者直接 fn() timeout = null }, wait) } }
獲取年份
/** * 獲取年份 */ export const getYear = () => { return new Date().getFullYear() }
獲取月份
/** * 獲取當前月份 * @param {Boolean} fillFlag 布爾值,是否補 0,默認爲 true */ export const getMonth = (fillFlag=true) => { const mon = new Date().getMonth() + 1 const monRe = mon if (fillFlag) mon < 10 ? `0${mon}` : mon return monRe }
獲取日
/** * 獲取日 * @param {Boolean} fillFlag 布爾值,是否補 0 */ export const getDay = (fillFlag=true) => { const day = new Date().getDate() const dayRe = day if (fillFlag) day < 10 ? `0${day}` : day return dayRe }
星期幾
/** * 獲取星期幾 */ export const getWhatDay = () => { return new Date().getDay() ? new Date().getDay() : 7 }
獲取當前月天數
/** * 獲取當前月天數 * @param {String} year 年份 * @param {String} month 月份 */ export const getMonthNum = (year, month) => { var d = new Date(year, month, 0) return d.getDate() }
獲取當前時間 yyyy-mm-dd,hh:mm:ss
/** * 獲取當前時間 yyyy-mm-dd,hh:mm:ss */ export const getYyMmDdHhMmSs = () => { const date = new Date() const year = date.getFullYear() const month = date.getMonth() + 1 const day = date.getDate() const hours = date.getHours() const minu = date.getMinutes() const second = date.getSeconds() const arr = [month, day, hours, minu, second] arr.forEach(item => { item < 10 ? '0' + item : item }) return ( year + '-' + arr[0] + '-' + arr[1] + ' ' + arr[2] + ':' + arr[3] + ':' + arr[4] ) }
時間戳轉化爲年月日
/** * 時間戳轉化爲年月日 * @param times 時間戳 * @param ymd 格式類型(yyyy-mm-dd,yyyy/mm/dd) * @param hms 可選,格式類型(hh,hh:mm,hh:mm:ss) * @returns {年月日} */ export const timesToYyMmDd = (times, ymd, hms) => { const oDate = new Date(times) const oYear = oDate.getFullYear() const oMonth = oDate.getMonth() + 1 const oDay = oDate.getDate() const oHour = oDate.getHours() const oMin = oDate.getMinutes() const oSec = oDate.getSeconds() let oTime // 最後拼接時間 // 年月日格式 switch (ymd) { case 'yyyy-mm-dd': oTime = oYear + '-' + getzf(oMonth) + '-' + getzf(oDay) break case 'yyyy/mm/dd': oTime = oYear + '/' + getzf(oMonth) + '/' + getzf(oDay) break } // 時分秒格式 switch (hms) { case 'hh': oTime = ' '+oTime + getzf(oHour) break case 'hh:mm': oTime = oTime + getzf(oHour) + ':' + getzf(oMin) break case 'hh:mm:ss': oTime = oTime + getzf(oHour) + ':' + getzf(oMin) + ':' + getzf(oSec) break } return oTime }
將年月日轉化成時間戳
/** * 將年月日轉化成時間戳 * @param {String} time yyyy/mm/dd 或yyyy-mm-dd 或yyyy-mm-dd hh:mm 或yyyy-mm-dd hh:mm:ss */ export const YyMmDdToTimes = (time) => { return new Date(time.replace(/-/g, '/')).getTime() }
/** * 比較時間 1 小於時間 2 * @param {String} timeOne 時間 1 * @param {String} timeTwo 時間 2 */ export const compareTimeOneLessTwo = (timeOne, timeTwo) => { // 判斷 timeOne 和 timeTwo 是否 return new Date(timeOne.replace(/-/g, '/')).getTime()<new Date(timeTwo.replace(/-/g, '/')).getTime() }
獲取 url 後面經過?傳參的參數~~~~
/** * 獲取 url 後面經過?傳參的參數 * @param {String} name */ export function getQueryString(name) { const reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)', 'i') const url = window.location.href const search = url.substring(url.lastIndexOf('?') + 1) const r = search.match(reg) if (r != null) return unescape(r[2]) return null }
碼字不易,持續更新中,歡迎 start!
給你們推薦一款 bug 管理工具,請戳
bug 管理工具