前言
前端開發有時會處理一部分后臺返回的數據,或者根據數據判斷做一些處理; 這個時候就非常有必要將一些常用的工具類封裝起來; 本文根據常用的一些工具類封裝了 59 個方法,當然還有很多用的較少前期沒有錄入,后期持續跟新; 源碼地址,utils-lan 源碼地址:https://github.com/lanzhsh/react-vue-koa/tree/master/utils-lan,歡迎 star!
使用
1.方法一
npm i -S utils-lan
import utils from 'utils-lan'
console.log(utils.arrJudge(['1','2']))
復制代碼
2.方法二 git clone utils-lan 源碼地址:https://github.com/lanzhsh/react-vue-koa/tree/master/utils-lan 下來導入項目;
3.關于類名 是根據字面量來命名的,方法首個駝峰表示所屬類型,后面是方法作用; 如 arrAndSet 一看就是數組的方法,是處理交集的; 如果實在難以忍受,可以采用方法 2,導入本地對項目進行更改.
arr
1.arrAndSet
并集
/**
* 數組并集,只支持一維數組
* @param {Array} arrOne
* @param {Array} arrTwo
*/
export const arrAndSet = (arrOne, arrTwo) => {
return arrOne.concat(arrTwo.filter(v => !arrOne.includes(v)))
}
復制代碼
2.arrIntersection
交集
/**
* 數組交集,只支持一維數組
* @param {Array} arrOne
* @param {Array} arrTwo
*/
export const arrIntersection = (arrOne, arrTwo) => {
return arrOne.filter(v => arrTwo.includes(v))
}
復制代碼
3.arrDifference
差集
/**
* 數組差集,只支持一維數組
* @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))
}
復制代碼
4.arrTwoToArrObj
兩個數組合并成一個數組對象
/**
* 兩個數組合并成一個對象數組,考慮到復雜度,所以目前支持兩個一維數組
* @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] }))
// 或者,此方法針對將 arrTwo 的索引作為 key 的情況,arrTwo 值會覆蓋 arrOne
// return Object.assign({}, arrOne, arrTwo)
}else{
return arrOne.map((oneKey, i) => ({ oneKey, twoKey: arrTwo[i] }))
}
}
復制代碼
5.arrObjSum
數組對象求和
/**
* 數組對象求和
* @param {Object} arrObj 數組對象
* @param {String} key 數組對應的 key 值
*/
export const arrObjSum = (obj, key) => {
return obj.reduce((prev, cur) => prev + cur.key, 0)
}
復制代碼
6.arrConcat
數組合并
/**
* 數組合并,目前合并一維
* @param {Array} arrOne 數組
* @param {Array} arrTwo 數組
*/
export const arrConcat = (arrOne, arrTwo) => {
return [...arrOne, ...arrTwo]
}
復制代碼
7.arrSum
數組求和
/**
* 數組求和
* @param {Array} arr 數組
*/
export const arrSum = arr => {
return arr.reduce((prev, cur)=> {
return prev + cur
}, 0)
}
復制代碼
8.arrIncludeValue
數組是否包含某值
/**
* 數組是否包含某值
* @param {Array} arr 數組
* @param {} value 值,目前只支持 String,Number,Boolean
*/
export const arrIncludeValue = (arr, value) => {
return arr.includes( value)
}
復制代碼
9.arrMax
數組最大值
/**
* 數組最大值
* @param {Array} arr 數組
*/
export const arrMax = arr => {
return Math.max(...arr)
}
復制代碼
10.arrRemoveRepeat
數組去重
/**
* 數組去重
* @param {Array} arr 數組
*/
export const arrRemoveRepeat = arr => {
return Array.from(new Set(arr))
}
復制代碼
11.arrOrderAscend
數組排序
/**
* 數組排序
* @param {Array} arr 數組
* @param {Boolean} ascendFlag 升序,默認為 true
*/
export const arrOrderAscend = (arr, ascendFlag=true) => {
return arr.sort((a, b) => {
return ascendFlag ? a - b : b - a
})
}
復制代碼
12.arrJudge
判斷是否是數組
/**
* 判斷是否是數組
* @param {Array}} arr 數組
*/
export const arrJudge = arr => Array.isArray(arr)
復制代碼
check
13.checkNum
判斷是否是數字
/**
* 判斷是否是數字
* @param {Number} data
*/
export const checkNum = data => /^d{1,}$/g.test(data)
復制代碼
14.checkLetter
判斷是否是字母
/**
* 判斷是否是字母
* @param {Number} data
*/
export const checkLetter = data => /^[a-zA-Z]+$/g.test(data)
復制代碼
15.checkLowercaseLetter
判斷是否全部是小寫字母
/**
* 判斷是否全部是小寫字母
* @param {Number} data
*/
export const checkLowercaseLetter = data => /^[a-z]+$/g.test(data)
復制代碼
16.checkCapitalLetter
判斷是否是大寫字母
/**
* 判斷是否是大寫字母
* @param {Number} data
*/
export const checkCapitalLetter = data => /^[A-Z]+$/g.test(data)
復制代碼
17.checkNumOrLetter
判斷是否是字母或數字
/**
* 判斷是否是字母或數字
* @param {Number || String} data 字符或數字
*/
export const checkNumOrLetter = data => /^[0-9a-zA-Z]*$/g.test(data)
復制代碼
判斷是否是字母和數字的組合
/**
* 判斷是否是字母或數字
* @param {Number || String} data 字符或數字
*/
export const checkNumAndLetter = data => /^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,15}$/g.test(data)
復制代碼
18.checkChinese
判斷是否是中文
/**
* 判斷是否是中文
* @param {String} data 中文
*/
export const checkChinese = data => /^[\u4E00-\u9FA5]+$/g.test(data)
復制代碼
19.checkChineseNumberLettter
判斷是否是中文,數字或字母
export const checkChineseNumberLettter = data => /^[a-zA-Z0-9\u4e00-\u9fa5]+$/g.test(data)
復制代碼
20.checkEmail
判斷是否是郵箱地址
/**
* 判斷是否是郵箱地址
* @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
}
復制代碼
21.checkTelphone
判斷是否是手機號
/**
* 判斷是否是手機號,只要是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
}
復制代碼
22.checkUrl
判斷是否是正確的網址
/**
* 判斷是否是正確的網址
* @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
}
復制代碼
client
23.checkBrowser
/**
* 判斷是瀏覽器內核
*/
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)]
};
復制代碼
24.checkIOSAndroidIpad
判斷是終端類型,值有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)]
};
復制代碼
25.checkWeixinQqUc
判斷是否是微信,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)]
};
復制代碼
26.checkIsiphoneX
檢查是否是 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;
}
};
復制代碼
file
27.fileFormatSize
格式化文件單位
/**
* 格式化文件單位
* @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]
}
復制代碼
obj
28.objIsEqual
判斷兩個對象是否相等,目前只支持對象值為簡單數據類型的判斷
/**
* 判斷兩個對象是否相等,目前只支持對象值為簡單數據類型的判斷
* @param {Object} oneObj 對象
* @param {Object} twoObj 對象
*/
export const objIsEqual = (oneObj, twoObj) => {
const aProps = Object.getOwnPropertyNames(oneObj);
const bProps = Object.getOwnPropertyNames(twoObj);
if (aProps.length != bProps.length) {
return false;
}
for (let i = 0; i < aProps.length; i++) {
let propName = aProps[i];
let propA = oneObj[propName];
let propB = twoObj[propName];
if ( propA !== propB) {
return false;
}
}
return true;
}
復制代碼
29.objDeepClone
對象深度克隆; 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)
}
復制代碼
storage
30.localStorageSet
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)
}
復制代碼
31.localStorageGet
localStorage 獲取
/**
* localStorage 獲取
* @param {String} key 屬性
*/
export const localStorageGet = (key) => {
return localStorage.getItem(key)
}
復制代碼
32.localStorageRemove
localStorage 移除
/**
* localStorage 移除
* @param {String} key 屬性
*/
export const localStorageRemove = (key) => {
localStorage.removeItem(key)
}
復制代碼
33.localStorageSetExpire
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)
}
復制代碼
34.sessionStorageSet
sessionStorage 存貯
/**
* sessionStorage 存貯
* @param {String} key 屬性
* @param {*} value 值
*/
export const sessionStorageSet = (key, value) => {
if (typeof (value) === 'object') value = JSON.stringify(value)
sessionStorage.setItem(key, value)
}
復制代碼
35.sessionStorageGet
sessionStorage 獲取
/**
* sessionStorage 獲取
* @param {String} key 屬性
*/
export const sessionStorageGet = (key) => {
return sessionStorage.getItem(key)
}
復制代碼
36.sessionStorageRemove
sessionStorage 刪除
/**
* sessionStorage 刪除
* @param {String} key 屬性
*/
export const sessionStorageRemove = (key, value) => {
sessionStorage.removeItem(key, value)
}
復制代碼
37.sessionStorageSetExpire
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)
}
復制代碼
38.cookieSet
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()}`
}
復制代碼
39.cookieGet
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
}
復制代碼
40.cookieRemove
cookie 刪除
/**
* cookie 刪除
* @param {String} key 屬性
*/
export const cookieRemove = (key) => {
document.cookie = `${encodeURIComponent(key)}=;expires=${new Date()}`
}
復制代碼
str
41.strTrimLeftOrRight
去掉字符左右空格
/**
* 去掉字符左右空格
* @param {String} str 字符
*/
export const strTrimLeftOrRight = str => {
return str.replace(/(^s*)|(s*$)/g, "")
}
復制代碼
42.strInclude
判斷字符是否包含某值
/**
* 判斷字符是否包含某值
* @param {String} str 字符
* @param {String} value 字符
*/
export const strInclude = (str, value) => {
return str.includes(value)
}
復制代碼
43.strBeginWith
判斷字符是否以某個字符開頭
/**
* 判斷字符是否以某個字符開頭
* @param {String} str 字符
* @param {String} value 字符
*/
export const strBeginWith = (str, value) => {
return str.indexOf(value) === 0
}
復制代碼
44.strReplace
全局替換某個字符為另一個字符
/**
* 全局替換某個字符為另一個字符
* @param {String} str 字符
* @param {String} valueOne 包含的字符
* @param {String} valueTwo 要替換的字符,選填
*/
export const strReplace = (str, valueOne, valueTwo) => {
return str.replace(new RegExp(valueOne,'g'), valueTwo)
}
復制代碼
45.strToCapital
將字母全部轉化成大寫
/**
* 將字母全部轉化成大寫
* @param {String} str 字符
*/
export const strToCapital = (str) => {
return str.toUpperCase()
}
復制代碼
46.strToLowercase
將字母全部轉化成小寫
/**
* 將字母全部轉化成小寫
* @param {String} str 字符
*/
export const strToLowercase = (str) => {
return str.toLowerCase()
}
復制代碼
47.strToCapitalLetter
將字母全部轉化成以大寫開頭
/**
* 將字母全部轉化成以大寫開頭
* @param {String} str 字符
*/
export const strToCapitalLetter = (str) => {
const strOne = str.toLowerCase()
return strOne.charAt(0).toUpperCase() + strOne.slice(1)
}
復制代碼
thrDeb
48.throttle
節流
/**
* 節流
* @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)
}
}
}
復制代碼
49.debounce
防抖
/**
* 防抖
* @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)
}
}
復制代碼
time
50.getYear
獲取年份
/**
* 獲取年份
*/
export const getYear = () => {
return new Date().getFullYear()
}
復制代碼
51.getMonth
獲取月份
/**
* 獲取當前月份
* @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
}
復制代碼
52.getDay
獲取日
/**
* 獲取日
* @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
}
復制代碼
53.getWhatDay
星期幾
/**
* 獲取星期幾
*/
export const getWhatDay = () => {
return new Date().getDay() ? new Date().getDay() : 7
}
復制代碼
54.getMonthNum
獲取當前月天數
/**
* 獲取當前月天數
* @param {String} year 年份
* @param {String} month 月份
*/
export const getMonthNum = (year, month) => {
var d = new Date(year, month, 0)
return d.getDate()
}
復制代碼
55.getYyMmDdHhMmSs
獲取當前時間 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]
)
}
復制代碼
56.timesToYyMmDd
時間戳轉化為年月日
/**
* 時間戳轉化為年月日
* @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
}
復制代碼
57.YyMmDdToTimes
將年月日轉化成時間戳
/**
* 將年月日轉化成時間戳
* @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()
}
復制代碼
58.compareTimeOneLessTwo
/**
* 比較時間 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
59.getQueryString
獲取 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!
github地址:https://github.com/lanzhsh/react-vue-koa/tree/master/utils-lan
原鏈接:https://juejin.im/post/5de5be53f265da05c33fcbb4