前端經常使用的 59 個工具類【持續更新】

js-logo.jpg

前言

前端開發有時會處理一部分後臺返回的數據,或者根據數據判斷作一些處理; 這個時候就很是有必要將一些經常使用的工具類封裝起來;
本文根據經常使用的一些工具類封裝了 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

arr

1.arrAndSet

並集ios

/**
 * 數組並集,只支持一維數組
 * @param {Array} arrOne
 * @param {Array} arrTwo
 */
export const arrAndSet = (arrOne, arrTwo) => {
  return arrOne.concat(arrTwo.filter(v => !arrOne.includes(v)))
}

2.arrIntersection

交集git

/**
 * 數組交集,只支持一維數組
 * @param {Array} arrOne
 * @param {Array} arrTwo
 */
export const arrIntersection = (arrOne, arrTwo) => {
  return arrOne.filter(v => arrTwo.includes(v))
}

3.arrDifference

差集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))
}

4.arrTwoToArrObj

兩個數組合併成一個數組對象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] }))
  }
}

5.arrObjSum

數組對象求和npm

/**
 * 數組對象求和
 * @param {Object} arrObj 數組對象
 * @param {String} key 數組對應的 key 值
 */
export const arrObjSum = (obj, key) => {
  return arrObj.reduce((prev, cur) => prev + cur.key, 0)
}

6.arrConcat

數組合並api

/**
 * 數組合並,目前合併一維
 * @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 => {
  if (Array.isArray(arr)) {
    return true
  }
}

check

13.checkNum

判斷是不是數字

/**
 *  判斷是不是數字
 * @param {Number} data
 */
export const checkNum = data => {
  const reg = /^\d{1,}$/g
  if (reg.test(data)) return true
}

14.checkLetter

判斷是不是字母

/**
 *  判斷是不是字母
 * @param {Number} data
 */
export const checkLetter = data => {
  const reg = /^[a-zA-Z]+$/g
  if (reg.test(data)) return true
}

15.checkLowercaseLetter

判斷是否所有是小寫字母

/**
 *  判斷是否所有是小寫字母
 * @param {Number} data
 */
export const checkLowercaseLetter = data => {
  const reg = /^[a-z]+$/g
  if (reg.test(data)) return true
}

16.checkCapitalLetter

判斷是不是大寫字母

/**
 *  判斷是不是大寫字母
 * @param {Number} data
 */
export const checkCapitalLetter = data => {
  const reg = /^[A-Z]+$/g
  if (reg.test(data)) return true
}

17.checkNumOrLetter

判斷是不是字母或數字

/**
 * 判斷是不是字母或數字
 * @param {Number || String} data  字符或數字
 */
export const checkNumOrLetter = data => {
  const reg = /^[0-9a-zA-Z]*$/g
  if (reg.test(data)) return true
}

18.checkChinese

判斷是不是中文

/**
 * 判斷是不是中文
 * @param {String} data  中文
 */
export const checkChinese = data => {
  const reg = /^[\u4E00-\u9FA5]+$/g
  if (reg.test(data)) return true
}

19.checkChineseNumberLettter

判斷是不是中文,數字或字母

export const checkChineseNumberLettter = data => {
  const reg = /^[a-zA-Z0-9\u4e00-\u9fa5]+$/g
  if (reg.test(data)) return true
}

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) => {
  return JSON.stringify(oneObj) === JSON.stringify(twoObj)
}

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 JSON.parse(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 JSON.parse(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!
給你們推薦一款 bug 管理工具,請戳
bug 管理工具

相關文章
相關標籤/搜索