#前端常用的 59 个工具类【持续更新】

前言

前端开发有时会处理一部分后台返回的数据,或者根据数据判断做一些处理;
这个时候就非常有必要将一些常用的工具类封装起来;
本文根据常用的一些工具类封装了 59 个方法,当然还有很多用的较少前期没有录入,后期持续跟新;
源码地址,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 源码地址下来导入项目;

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])?)*$/gif (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}$/gif (reg.test(data)) return true
}
复制代码

22.checkUrl

判断是否是正确的网址

/*** 判断是否是正确的网址* @param {String} url 网址*/
export const checkUrl = url => {const a = document.createElement('a')a.href = urlreturn [/^(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, //是否QQuc: 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 ivar 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 nullif (typeof parent !== 'object') return parentlet child, protoif (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 = nullreturn 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 = nullreturn 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() + 1const monRe = monif (fillFlag) mon < 10 ? `0${mon}` : monreturn monRe
}
复制代码

52.getDay

获取日

/*** 获取日* @param {Boolean} fillFlag 布尔值,是否补 0*/
export const getDay = (fillFlag=true) => {const day = new Date().getDate()const dayRe = dayif (fillFlag) day < 10 ? `0${day}` : dayreturn 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() + 1const 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,index) => {arr[index]=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() + 1const 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)breakcase 'yyyy/mm/dd':oTime = oYear + '/' + getzf(oMonth) + '/' + getzf(oDay)break}// 时分秒格式switch (hms) {case 'hh':oTime = ' '+oTime + getzf(oHour)breakcase 'hh:mm':oTime = oTime + getzf(oHour) + ':' + getzf(oMin)breakcase '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.hrefconst search = url.substring(url.lastIndexOf('?') + 1)const r = search.match(reg)if (r != null) return unescape(r[2])return null
}
复制代码

###1.邮箱

export const isEmail = (s) => {return /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((.[a-zA-Z0-9_-]{2,3}){1,2})$/.test(s)
}

###2.手机号码

export const isMobile = (s) => {return /^1[0-9]{10}$/.test(s)
}

###3.电话号码

export const isPhone = (s) => {return /^([0-9]{3,4}-)?[0-9]{7,8}$/.test(s)
}

###4.是否url地址

export const isURL = (s) => {return /^http[s]?:\/\/.*/.test(s)
}

###5.是否字符串

export const isString = (o) => {return Object.prototype.toString.call(o).slice(8, -1) === 'String'
}

###6.是否数字

export const isNumber = (o) => {return Object.prototype.toString.call(o).slice(8, -1) === 'Number'
}

###7.是否boolean

export const isBoolean = (o) => {return Object.prototype.toString.call(o).slice(8, -1) === 'Boolean'
}

###8.是否函数

export const isFunction = (o) => {return Object.prototype.toString.call(o).slice(8, -1) === 'Function'
}

###9.是否为null

export const isNull = (o) => {return Object.prototype.toString.call(o).slice(8, -1) === 'Null'
}

###10.是否undefined

export const isUndefined = (o) => {return Object.prototype.toString.call(o).slice(8, -1) === 'Undefined'
}

###11.是否对象

export const isObj = (o) => {return Object.prototype.toString.call(o).slice(8, -1) === 'Object'
}

###12.是否数组

export const isArray = (o) => {return Object.prototype.toString.call(o).slice(8, -1) === 'Array'
}

###13.是否时间

export const isDate = (o) => {return Object.prototype.toString.call(o).slice(8, -1) === 'Date'
}

###14.是否正则

export const isRegExp = (o) => {return Object.prototype.toString.call(o).slice(8, -1) === 'RegExp'
}

###15.是否错误对象

export const isError = (o) => {return Object.prototype.toString.call(o).slice(8, -1) === 'Error'
}

###16.是否Symbol函数

export const isSymbol = (o) => {return Object.prototype.toString.call(o).slice(8, -1) === 'Symbol'
}

###17.是否Promise对象

export const isPromise = (o) => {return Object.prototype.toString.call(o).slice(8, -1) === 'Promise'
}

###18.是否Set对象

export const isSet = (o) => {return Object.prototype.toString.call(o).slice(8, -1) === 'Set'
}
export const ua = navigator.userAgent.toLowerCase();

###19.是否是微信浏览器

export const isWeiXin = () => {return ua.match(/microMessenger/i) == 'micromessenger'
}

###20.是否是移动端

export const isQQBrowser = () => {return !!ua.match(/mqqbrowser|qzone|qqbrowser|qbwebviewtype/i)
}

###22.是否是爬虫

export const isSpider = () => {return /adsbot|googlebot|bingbot|msnbot|yandexbot|baidubot|robot|careerbot|seznambot|bot|baiduspider|jikespider|symantecspider|scannerlwebcrawler|crawler|360spider|sosospider|sogou web sprider|sogou orion spider/.test(ua)
}

###23.是否ios

export const isIos = () => {var u = navigator.userAgent;if (u.indexOf('Android') > -1 || u.indexOf('Linux') > -1) {  //安卓手机return false} else if (u.indexOf('iPhone') > -1) {//苹果手机return true} else if (u.indexOf('iPad') > -1) {//iPadreturn false} else if (u.indexOf('Windows Phone') > -1) {//winphone手机return false} else {return false}
}

###24.是否为PC端

export const isPC = () => {var userAgentInfo = navigator.userAgent;var Agents = ["Android", "iPhone","SymbianOS", "Windows Phone","iPad", "iPod"];var flag = true;for (var v = 0; v < Agents.length; v++) {if (userAgentInfo.indexOf(Agents[v]) > 0) {flag = false;break;}}return flag;
}

###25.去除html标签

export const removeHtmltag = (str) => {return str.replace(/<[^>]+>/g, '')
}

###26.获取url参数

export const getQueryString = (name) => {const reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)', 'i');const search = window.location.search.split('?')[1] || '';const r = search.match(reg) || [];return r[2];
}

###27.动态引入js

export const injectScript = (src) => {const s = document.createElement('script');s.type = 'text/javascript';s.async = true;s.src = src;const t = document.getElementsByTagName('script')[0];t.parentNode.insertBefore(s, t);
}

###28.根据url地址下载

export const download = (url) => {var isChrome = navigator.userAgent.toLowerCase().indexOf('chrome') > -1;var isSafari = navigator.userAgent.toLowerCase().indexOf('safari') > -1;if (isChrome || isSafari) {var link = document.createElement('a');link.href = url;if (link.download !== undefined) {var fileName = url.substring(url.lastIndexOf('/') + 1, url.length);link.download = fileName;}if (document.createEvent) {var e = document.createEvent('MouseEvents');e.initEvent('click', true, true);link.dispatchEvent(e);return true;}}if (url.indexOf('?') === -1) {url += '?download';}window.open(url, '_self');return true;
}

###29.el是否包含某个class

export const hasClass = (el, className) => {let reg = new RegExp('(^|\\s)' + className + '(\\s|$)')return reg.test(el.className)
}

###30.el添加某个class

export const addClass = (el, className) => {if (hasClass(el, className)) {return}let newClass = el.className.split(' ')newClass.push(className)el.className = newClass.join(' ')
}

31.el去除某个class

export const removeClass = (el, className) => {if (!hasClass(el, className)) {return}let reg = new RegExp('(^|\\s)' + className + '(\\s|$)', 'g')el.className = el.className.replace(reg, ' ')
}

###32.获取滚动的坐标

export const getScrollPosition = (el = window) => ({x: el.pageXOffset !== undefined ? el.pageXOffset : el.scrollLeft,y: el.pageYOffset !== undefined ? el.pageYOffset : el.scrollTop
});

###33.滚动到顶部

export const scrollToTop = () => {const c = document.documentElement.scrollTop || document.body.scrollTop;if (c > 0) {window.requestAnimationFrame(scrollToTop);window.scrollTo(0, c - c / 8);}
}

###34.el是否在视口范围内

export const elementIsVisibleInViewport = (el, partiallyVisible = false) => {const { top, left, bottom, right } = el.getBoundingClientRect();const { innerHeight, innerWidth } = window;return partiallyVisible? ((top > 0 && top < innerHeight) || (bottom > 0 && bottom < innerHeight)) &&((left > 0 && left < innerWidth) || (right > 0 && right < innerWidth)): top >= 0 && left >= 0 && bottom <= innerHeight && right <= innerWidth;
}

###35.洗牌算法随机

export const shuffle = (arr) => {var result = [],random;while (arr.length > 0) {random = Math.floor(Math.random() * arr.length);result.push(arr[random])arr.splice(random, 1)}return result;
}

###36.拦截粘贴板

export const copyTextToClipboard = (value) => {var textArea = document.createElement("textarea");textArea.style.background = 'transparent';textArea.value = value;document.body.appendChild(textArea);textArea.select();try {var successful = document.execCommand('copy');} catch (err) {console.log('Oops, unable to copy');}document.body.removeChild(textArea);
}

###37.判断类型集合

export const checkStr = (str, type) => {switch (type) {case 'phone':   //手机号码return /^1[3|4|5|6|7|8|9][0-9]{9}$/.test(str);case 'tel':     //座机return /^(0\d{2,3}-\d{7,8})(-\d{1,4})?$/.test(str);case 'card':    //身份证return /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/.test(str);case 'pwd':     //密码以字母开头,长度在6~18之间,只能包含字母、数字和下划线return /^[a-zA-Z]\w{5,17}$/.test(str)case 'postal':  //邮政编码return /[1-9]\d{5}(?!\d)/.test(str);case 'QQ':      //QQ号return /^[1-9][0-9]{4,9}$/.test(str);case 'email':   //邮箱return /^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/.test(str);case 'money':   //金额(小数点2位)return /^\d*(?:\.\d{0,2})?$/.test(str);case 'URL':     //网址return /(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?/.test(str)case 'IP':      //IPreturn /((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))/.test(str);case 'date':    //日期时间return /^(\d{4})\-(\d{2})\-(\d{2}) (\d{2})(?:\:\d{2}|:(\d{2}):(\d{2}))$/.test(str) || /^(\d{4})\-(\d{2})\-(\d{2})$/.test(str)case 'number':  //数字return /^[0-9]$/.test(str);case 'english': //英文return /^[a-zA-Z]+$/.test(str);case 'chinese': //中文return /^[\\u4E00-\\u9FA5]+$/.test(str);case 'lower':   //小写return /^[a-z]+$/.test(str);case 'upper':   //大写return /^[A-Z]+$/.test(str);case 'HTML':    //HTML标记return /<("[^"]*"|'[^']*'|[^'">])*>/.test(str);default:return true;}
}

###38.严格的身份证校验

export const isCardID = (sId) => {if (!/(^\d{15}$)|(^\d{17}(\d|X|x)$)/.test(sId)) {console.log('你输入的身份证长度或格式错误')return false}//身份证城市var aCity = { 11: "北京", 12: "天津", 13: "河北", 14: "山西", 15: "内蒙古", 21: "辽宁", 22: "吉林", 23: "黑龙江", 31: "上海", 32: "江苏", 33: "浙江", 34: "安徽", 35: "福建", 36: "江西", 37: "山东", 41: "河南", 42: "湖北", 43: "湖南", 44: "广东", 45: "广西", 46: "海南", 50: "重庆", 51: "四川", 52: "贵州", 53: "云南", 54: "西藏", 61: "陕西", 62: "甘肃", 63: "青海", 64: "宁夏", 65: "新疆", 71: "台湾", 81: "香港", 82: "澳门", 91: "国外" };if (!aCity[parseInt(sId.substr(0, 2))]) {console.log('你的身份证地区非法')return false}// 出生日期验证var sBirthday = (sId.substr(6, 4) + "-" + Number(sId.substr(10, 2)) + "-" + Number(sId.substr(12, 2))).replace(/-/g, "/"),d = new Date(sBirthday)if (sBirthday != (d.getFullYear() + "/" + (d.getMonth() + 1) + "/" + d.getDate())) {console.log('身份证上的出生日期非法')return false}// 身份证号码校验var sum = 0,weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2],codes = "10X98765432"for (var i = 0; i < sId.length - 1; i++) {sum += sId[i] * weights[i];}var last = codes[sum % 11]; //计算出来的最后一位身份证号码if (sId[sId.length - 1] != last) {console.log('你输入的身份证号非法')return false}return true
}

###39.随机数范围

export const random = (min, max) => {if (arguments.length === 2) {return Math.floor(min + Math.random() * ((max + 1) - min))} else {return null;}
}

###40.将阿拉伯数字翻译成中文的大写数字

export const numberToChinese = (num) => {var AA = new Array("零", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十");var BB = new Array("", "十", "百", "仟", "萬", "億", "点", "");var a = ("" + num).replace(/(^0*)/g, "").split("."),k = 0,re = "";for (var i = a[0].length - 1; i >= 0; i--) {switch (k) {case 0:re = BB[7] + re;break;case 4:if (!new RegExp("0{4}//d{" + (a[0].length - i - 1) + "}$").test(a[0]))re = BB[4] + re;break;case 8:re = BB[5] + re;BB[7] = BB[5];k = 0;break;}if (k % 4 == 2 && a[0].charAt(i + 2) != 0 && a[0].charAt(i + 1) == 0)re = AA[0] + re;if (a[0].charAt(i) != 0)re = AA[a[0].charAt(i)] + BB[k % 4] + re;k++;}if (a.length > 1) // 加上小数部分(如果有小数部分){re += BB[6];for (var i = 0; i < a[1].length; i++)re += AA[a[1].charAt(i)];}if (re == '一十')re = "十";if (re.match(/^一/) && re.length == 3)re = re.replace("一", "");return re;
}

###41.将数字转换为大写金额

export const changeToChinese = (Num) => {//判断如果传递进来的不是字符的话转换为字符if (typeof Num == "number") {Num = new String(Num);};Num = Num.replace(/,/g, "") //替换tomoney()中的“,”Num = Num.replace(/ /g, "") //替换tomoney()中的空格Num = Num.replace(/¥/g, "") //替换掉可能出现的¥字符if (isNaN(Num)) { //验证输入的字符是否为数字//alert("请检查小写金额是否正确");return "";};//字符处理完毕后开始转换,采用前后两部分分别转换var part = String(Num).split(".");var newchar = "";//小数点前进行转化for (var i = part[0].length - 1; i >= 0; i--) {if (part[0].length > 10) {return "";//若数量超过拾亿单位,提示}var tmpnewchar = ""var perchar = part[0].charAt(i);switch (perchar) {case "0":tmpnewchar = "零" + tmpnewchar;break;case "1":tmpnewchar = "壹" + tmpnewchar;break;case "2":tmpnewchar = "贰" + tmpnewchar;break;case "3":tmpnewchar = "叁" + tmpnewchar;break;case "4":tmpnewchar = "肆" + tmpnewchar;break;case "5":tmpnewchar = "伍" + tmpnewchar;break;case "6":tmpnewchar = "陆" + tmpnewchar;break;case "7":tmpnewchar = "柒" + tmpnewchar;break;case "8":tmpnewchar = "捌" + tmpnewchar;break;case "9":tmpnewchar = "玖" + tmpnewchar;break;}switch (part[0].length - i - 1) {case 0:tmpnewchar = tmpnewchar + "元";break;case 1:if (perchar != 0) tmpnewchar = tmpnewchar + "拾";break;case 2:if (perchar != 0) tmpnewchar = tmpnewchar + "佰";break;case 3:if (perchar != 0) tmpnewchar = tmpnewchar + "仟";break;case 4:tmpnewchar = tmpnewchar + "万";break;case 5:if (perchar != 0) tmpnewchar = tmpnewchar + "拾";break;case 6:if (perchar != 0) tmpnewchar = tmpnewchar + "佰";break;case 7:if (perchar != 0) tmpnewchar = tmpnewchar + "仟";break;case 8:tmpnewchar = tmpnewchar + "亿";break;case 9:tmpnewchar = tmpnewchar + "拾";break;}var newchar = tmpnewchar + newchar;}//小数点之后进行转化if (Num.indexOf(".") != -1) {if (part[1].length > 2) {// alert("小数点之后只能保留两位,系统将自动截断");part[1] = part[1].substr(0, 2)}for (i = 0; i < part[1].length; i++) {tmpnewchar = ""perchar = part[1].charAt(i)switch (perchar) {case "0":tmpnewchar = "零" + tmpnewchar;break;case "1":tmpnewchar = "壹" + tmpnewchar;break;case "2":tmpnewchar = "贰" + tmpnewchar;break;case "3":tmpnewchar = "叁" + tmpnewchar;break;case "4":tmpnewchar = "肆" + tmpnewchar;break;case "5":tmpnewchar = "伍" + tmpnewchar;break;case "6":tmpnewchar = "陆" + tmpnewchar;break;case "7":tmpnewchar = "柒" + tmpnewchar;break;case "8":tmpnewchar = "捌" + tmpnewchar;break;case "9":tmpnewchar = "玖" + tmpnewchar;break;}if (i == 0) tmpnewchar = tmpnewchar + "角";if (i == 1) tmpnewchar = tmpnewchar + "分";newchar = newchar + tmpnewchar;}}//替换所有无用汉字while (newchar.search("零零") != -1)newchar = newchar.replace("零零", "零");newchar = newchar.replace("零亿", "亿");newchar = newchar.replace("亿万", "亿");newchar = newchar.replace("零万", "万");newchar = newchar.replace("零元", "元");newchar = newchar.replace("零角", "");newchar = newchar.replace("零分", "");if (newchar.charAt(newchar.length - 1) == "元") {newchar = newchar + "整"}return newchar;
}

###42.判断一个元素是否在数组中

export const contains = (arr, val) => {return arr.indexOf(val) != -1 ? true : false;
}

###43.数组排序,{type} 1:从小到大 2:从大到小 3:随机

export const sort = (arr, type = 1) => {return arr.sort((a, b) => {switch (type) {case 1:return a - b;case 2:return b - a;case 3:return Math.random() - 0.5;default:return arr;}})
}

###44.去重

export const unique = (arr) => {if (Array.hasOwnProperty('from')) {return Array.from(new Set(arr));} else {var n = {}, r = [];for (var i = 0; i < arr.length; i++) {if (!n[arr[i]]) {n[arr[i]] = true;r.push(arr[i]);}}return r;}
}

###45.求两个集合的并集

export const union = (a, b) => {var newArr = a.concat(b);return this.unique(newArr);
}

###46.求两个集合的交集

export const intersect = (a, b) => {var _this = this;a = this.unique(a);return this.map(a, function (o) {return _this.contains(b, o) ? o : null;});
}

###47.删除其中一个元素

export const remove = (arr, ele) => {var index = arr.indexOf(ele);if (index > -1) {arr.splice(index, 1);}return arr;
}

###48.将类数组转换为数组

export const formArray = (ary) => {var arr = [];if (Array.isArray(ary)) {arr = ary;} else {arr = Array.prototype.slice.call(ary);};return arr;
}

###49.最大值

export const max = (arr) => {return Math.max.apply(null, arr);
}

###50.最小值

export const min = (arr) => {return Math.min.apply(null, arr);
}

###51.求和

export const sum = (arr) => {return arr.reduce((pre, cur) => {return pre + cur})
}

###52.平均值

export const average = (arr) => {return this.sum(arr) / arr.length
}

###53.去除空格,type: 1-所有空格 2-前后空格 3-前空格 4-后空格

export const trim = (str, type) => {type = type || 1switch (type) {case 1:return str.replace(/\s+/g, "");case 2:return str.replace(/(^\s*)|(\s*$)/g, "");case 3:return str.replace(/(^\s*)/g, "");case 4:return str.replace(/(\s*$)/g, "");default:return str;}
}

###54.字符转换,type: 1:首字母大写 2:首字母小写 3:大小写转换 4:全部大写 5:全部小写

export const changeCase = (str, type) => {type = type || 4switch (type) {case 1:return str.replace(/\b\w+\b/g, function (word) {return word.substring(0, 1).toUpperCase() + word.substring(1).toLowerCase();});case 2:return str.replace(/\b\w+\b/g, function (word) {return word.substring(0, 1).toLowerCase() + word.substring(1).toUpperCase();});case 3:return str.split('').map(function (word) {if (/[a-z]/.test(word)) {return word.toUpperCase();} else {return word.toLowerCase()}}).join('')case 4:return str.toUpperCase();case 5:return str.toLowerCase();default:return str;}
}

###55.检测密码强度

export const checkPwd = (str) => {var Lv = 0;if (str.length < 6) {return Lv}if (/[0-9]/.test(str)) {Lv++}if (/[a-z]/.test(str)) {Lv++}if (/[A-Z]/.test(str)) {Lv++}if (/[\.|-|_]/.test(str)) {Lv++}return Lv;
}

###56.函数节流器

export const debouncer = (fn, time, interval = 200) => {if (time - (window.debounceTimestamp || 0) > interval) {fn && fn();window.debounceTimestamp = time;}
}

###57.在字符串中插入新字符串

export const insertStr = (soure, index, newStr) => {var str = soure.slice(0, index) + newStr + soure.slice(index);return str;
}

###58.判断两个对象是否键值相同

export const isObjectEqual = (a, b) => {var aProps = Object.getOwnPropertyNames(a);var bProps = Object.getOwnPropertyNames(b);if (aProps.length !== bProps.length) {return false;}for (var i = 0; i < aProps.length; i++) {var propName = aProps[i];if (a[propName] !== b[propName]) {return false;}}return true;
}

###59.16进制颜色转RGBRGBA字符串

export const colorToRGB = (val, opa) => {var pattern = /^(#?)[a-fA-F0-9]{6}$/; //16进制颜色值校验规则var isOpa = typeof opa == 'number'; //判断是否有设置不透明度if (!pattern.test(val)) { //如果值不符合规则返回空字符return '';}var v = val.replace(/#/, ''); //如果有#号先去除#号var rgbArr = [];var rgbStr = '';for (var i = 0; i < 3; i++) {var item = v.substring(i * 2, i * 2 + 2);var num = parseInt(item, 16);rgbArr.push(num);}rgbStr = rgbArr.join();rgbStr = 'rgb' + (isOpa ? 'a' : '') + '(' + rgbStr + (isOpa ? ',' + opa : '') + ')';return rgbStr;
}

###60.追加url参数

export const appendQuery = (url, key, value) => {var options = key;if (typeof options == 'string') {options = {};options[key] = value;}options = $.param(options);if (url.includes('?')) {url += '&' + options} else {url += '?' + options}return url;
}

总结

码字不易,持续更新中,欢迎 start!

前端常用的 59 个工具类【持续更新】相关推荐

  1. android 开发工具类,Android中常用开发工具类—持续更新...

    一.自定义ActionBar public class ActionBarTool { public static void setActionBarLayout(Activity act,Conte ...

  2. 前端常用60余种工具方法(下)

    前端常用60余种工具方法(上) 41.将数字转换为大写金额 export const changeToChinese = (Num) => {//判断如果传递进来的不是字符的话转换为字符if ( ...

  3. 前端常用60余种工具方法(上)

    1.邮箱 export const isEmail = (s) => {return /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((.[a-zA-Z0-9_-]{2, ...

  4. java常用地图坐标系转换工具类,支持谷歌,腾讯,百度等主流的地理坐标转换

    package com.shen.springboot.redis.util;import java.util.ArrayList; import java.util.HashMap; import ...

  5. 一个免费下拉关键词SEO小工具(持续更新中...)

    一个免费下拉关键词SEO小工具(持续更新中...) 帮助链接:转接 后续功能: 支持界面设置关键词 支持后台运行

  6. OI常用的数学知识大全(持续更新)

    OI常用的数学知识总结 本文持续更新-- 总结一下OI中的玄学数学知识 先列个单子,from秦神 数论 模意义下的基本运算和欧拉定理 筛素数和判定素数欧几里得算法及其扩展[finish] 数论函数和莫 ...

  7. 【总结】前端常用60余种校验类工具方法

    工欲善其事必先利其器,前端开发有时会处理一部分后台返回的数据或者根据数据判断做一些处理,这个时候就非常有必要将一些常用的工具类封装起来. 1.邮箱 export const isEmail = (s) ...

  8. 推荐 12 个学习前端必备的神仙级工具类项目与网站

    大家好,我是你们的 猫哥,一个不喜欢吃鱼.又不喜欢喵 的超级猫 ~ 前言 猫哥是一个常年混迹在 GitHub 上的猫星人,所以发现了不少好的前端开源项目.常用技巧,在此分享给大家. 公众号:前端Git ...

  9. Java常用的格式化Json工具类

    扩展:Java常用工具类汇总 文章目录 前置条件 一.数组格式json转成 `,`隔开的字符串 二.String转List<对象> 三.String转Map 四.未完待续~ 前置条件 导入 ...

最新文章

  1. 在Ubuntu 16.04.6 LTS升级python 3.5.x到3.7.3之后导致gnome-ternimal无法打开的解决办法
  2. 总结|C语言实现的矩阵运算(svd分解、乘法、转置等)
  3. 关于Nginx location中配置proxy_pass转发时斜线'/'导致的404问题
  4. fastjson对json字符串JSONObject和JSONArray互相转换操作示例
  5. 依赖注入容器 Castle windsor的使用
  6. python编辑程序模型_Python编程语言实行尽可能成熟、稳定的新管理模型
  7. Unity 2017 Game Optimization 读书笔记 Dynamic Graphics (5) Shader优化
  8. 一击即中的表白方式,学会了吗?
  9. axture动画原型制作_Axure制作原型-基础操作
  10. 20道C#练习题(一)1——10题
  11. [poj3261]Milk Patterns
  12. git cherry pick
  13. 综合对比各个设计模式的思想
  14. 排列(permutation)的末尾 0 的个数
  15. 单片机 STM32 HAL GSM通讯 SIM800L
  16. Mugeda(木疙瘩)H5案例课—教你玩转密室逃脱类H5-岑远科-专题视频课程
  17. UML核心元素之参与者
  18. 阿里云服务器部署(保姆级)
  19. 电脑重装系统后文件怎么恢复
  20. 我陪你慢慢成长——苏子语录2015下半…

热门文章

  1. AssetBundle加载和卸载
  2. 能把音频转换成文字的软件推荐,快收藏起来
  3. 一些新的 UI 图免费下载
  4. (3)elasticsearch相关概念和索引的CURD
  5. 温度、压力、物位仪表工作原理
  6. Complex Network Analysis in Python学习笔记
  7. 光电滑环结构原理是什么
  8. 一个32岁程序员的倔强
  9. c语言输出 inf是什么意思,cuffdiff 输出文件中的inf和nan的意思
  10. endpoint下载