JS工具函数

梳理工具函数,助力高效研发。

目录

校验数据类型

大小写转换

RGB转换为十六进制

金额格式化

四舍五入到指定位数

数组对象根据字段去重

从数组中删除重复项

手机号脱敏

时间操作

生成随机字符串

生成随机字符串

从2个整数中获取一个随机整数

随机选择一种十六进制的颜色值

防抖、节流

判难手机是Andoird还是IOS

判断是否处于暗模式

开启全屏、关闭全屏

解析URL参数

滚动到页面顶部、滚动到元素位置

uuid

存储操作

下载文件

深拷贝

模糊检索

遍历树节点


  1. 校验数据类型

    1. export const trueTypeOf = (obj) => Object.prototype.toString.call(obj).slice(8, -1).toLowerCase();
      
      // 示例:
      trueTypeOf(‘’); // string
      trueTypeOf(0); // number
      trueTypeOf(); // undefined
      trueTypeOf(null); // null
      trueTypeOf({}); // object
      trueTypeOf([]); // array
      trueTypeOf(0); // number
      trueTypeOf(() => {}); // function
  2. 大小写转换

    1. /**
      * str 待转换的字符串
      * type 1-全大写 2-全小写 3-首字母大写
      **/
      export const turnCase = (str, type) => {
        switch (type) {
          case 1:
            return str.toUpperCase()
          case 2:
            return str.toLowerCase()
          case 3:
            //return str[0].toUpperCase() + str.substr(1).toLowerCase() // substr 已不推荐使用
            return str[0].toUpperCase() + str.substring(1).toLowerCase()
          default:
            return str
        }
      }
      
      // 示例
      turnCase('vue', 1) // VUE
      turnCase('REACT', 2) // react
      turnCase('vue', 3) // Vue
  3. RGB转换为十六进制

    1. const rgbToHex = (r, g, b) => "#" + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1);
      
      //示例
      rgbToHex(255, 255, 255);  // '#ffffff'
  4. 金额格式化

    1. /**
      * {number} number:要格式化的数字
      * {number} decimals:保留几位小数
      * {string} dec_point:小数点符号
      * {string} thousands_sep:千分位符号
      **/
      export const moneyFormat = (number, decimals, dec_point, thousands_sep) => {
        number = (number + '').replace(/[^0-9+-Ee.]/g, '')
        const n = !isFinite(+number) ? 0 : +number
        const prec = !isFinite(+decimals) ? 2 : Math.abs(decimals)
        const sep = typeof thousands_sep === 'undefined' ? ',' : thousands_sep
        const dec = typeof dec_point === 'undefined' ? '.' : dec_point
        let s = ''
        const toFixedFix = function(n, prec) {
          const k = Math.pow(10, prec)
          return '' + Math.ceil(n * k) / k
        }
        s = (prec ? toFixedFix(n, prec) : '' + Math.round(n)).split('.')
        const re = /(-?\d+)(\d{3})/
        while (re.test(s[0])) {
          s[0] = s[0].replace(re, '$1' + sep + '$2')
        }
      
        if ((s[1] || '').length < prec) {
          s[1] = s[1] || ''
          s[1] += new Array(prec - s[1].length + 1).join('0')
        }
        return s.join(dec)
      }
      
      // 示例:
      moneyFormat(10000000) // 10,000,000.00
      moneyFormat(10000000, 3, '.', '-') // 10-000-000.000
  5. 四舍五入到指定位数

    1. const round = (n, d) => Number(Math.round(n + “e” + d) + “e-” + d)
      
      //示例
      round(1.005, 2) //1.01
      round(1.555, 2) //1.56
  6. 数组对象根据字段去重

    1. export const uniqueArrayObject = (arr = [], key = 'id') => {
        if (arr.length === 0) return
        let list = []
        const map = {}
        arr.forEach((item) => {
          if (!map[item[key]]) {
            map[item[key]] = item
          }
        })
        list = Object.values(map)
      
        return list
      }
      
      // 示例
      const responseList = [
          { id: 1, name: '小哥' },
          { id: 2, name: '黄老爷' },
          { id: 3, name: '张麻子' },
          { id: 1, name: '黄老爷' },
          { id: 2, name: '张麻子' },
          { id: 3, name: '小哥' },
          { id: 1, name: '小哥' },
          { id: 2, name: '黄老爷' },
          { id: 3, name: '张麻子' },
      ]
      
      uniqueArrayObject(responseList, 'id')
      // [{ id: 1, name: '小哥' },{ id: 2, name: '黄老爷' },{ id: 3, name: '张麻子' }]
  7. 从数组中删除重复项

    1. //方法1:
      
      const removeDuplicates = (arr) => [... .new Set(arr)];
      
      console.log(removeDuplicates([1,2,2,2,5,66,666,55,5])); //[1,2,5,66,666,55]
  8. 手机号脱敏

    1. export const hideMobile = (mobile) => {
        return mobile.replace(/^(\d{3})\d{4}(\d{4})$/, "$1****$2")
      }
  9. 时间操作

    1. 强烈推荐使用 day.js
  10. 生成随机字符串

    1. 生成随机字符串

      1. 
        const randomString = () => Math.random().toString(36).slice(2);
        //示例
        randomString();
    2. 从2个整数中获取一个随机整数

      1. const random = (min, max) => Math.floor(Math.random() * (max — min + 1) + min);
        
        // 示例:
        random(1, 50);
    3. 随机选择一种十六进制的颜色值

      1. const randomHex = () => `#${Math.floor(Math.random() * 0xffffff).toString(16).padEnd(6, "0")}`;
        
        // 示例:
        randomHex();
  11. 防抖、节流

    1. // 防抖
      export const debounce = (() => {
        let timer = null
        return (callback, wait = 800) => {
          timer&&clearTimeout(timer)
          timer = setTimeout(callback, wait)
        }
      })();
      // 示例:vue中使用
      methods: {
        loadList() {
          debounce(() => {
            console.log('加载数据')
          }, 500)
        }
      }
      
      
      // 节流
      export const throttle = (() => {
        let last = 0
        return (callback, wait = 800) => {
          let now = +new Date()
          if (now - last > wait) {
            callback()
            last = now
          }
        }
      })();
  12. 判难手机是Andoird还是IOS

    1. /** 
       * 1: ios
       * 2: android
       * 3: 其它
       */
      export const getOSType=() => {
        let u = navigator.userAgent, app = navigator.appVersion;
        let isAndroid = u.indexOf('Android') > -1 || u.indexOf('Linux') > -1;
        let isIOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/);
        if (isIOS) {
          return 1;
        }
        if (isAndroid) {
          return 2;
        }
        return 3;
      }

  13. 判断是否处于暗模式

    1. const isDarkMode = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches
      console.log(isDarkMode)
  14. 开启全屏、关闭全屏

    1. // 开启全屏
      export const launchFullscreen = (element) => {
        if (element.requestFullscreen) {
          element.requestFullscreen()
        } else if (element.mozRequestFullScreen) {
          element.mozRequestFullScreen()
        } else if (element.msRequestFullscreen) {
          element.msRequestFullscreen()
        } else if (element.webkitRequestFullscreen) {
          element.webkitRequestFullScreen()
        }
      }
      
      // 关闭全屏
      export const exitFullscreen = () => {
        if (document.exitFullscreen) {
          document.exitFullscreen()
        } else if (document.msExitFullscreen) {
          document.msExitFullscreen()
        } else if (document.mozCancelFullScreen) {
          document.mozCancelFullScreen()
        } else if (document.webkitExitFullscreen) {
          document.webkitExitFullscreen()
        }
      }
      
      
      
  15. 解析URL参数

    1. export const getSearchParams = () => {
        const searchPar = new URLSearchParams(window.location.search)
        const paramsObj = {}
        for (const [key, value] of searchPar.entries()) {
          paramsObj[key] = value
        }
        return paramsObj
      }
      
      // 示例
      // 假设URL https://****com/index?id=154513&age=18;
      getSearchParams(); // {id: "154513", age: "18"}
  16. 滚动到页面顶部、滚动到元素位置

    1. /**
      * 滚动到页面顶部
      **/
      export const scrollToTop = () => {
        const height = document.documentElement.scrollTop || document.body.scrollTop;
        if (height > 0) {
          window.requestAnimationFrame(scrollToTop);
          window.scrollTo(0, height - height / 8);
        }
      }
      
      
      /**
      * 滚动到元素位置
      **/
      export const smoothScroll = element =>{
          document.querySelector(element).scrollIntoView({
              behavior: 'smooth'
          });
      };
      //示例
      smoothScroll('#target'); // 平滑滚动到 ID 为 target 的元素
      
      
      
      /**
      * 判断页面是否在底部
      **/
      
      const scrolledToBottom = () => document.documentElement.clientHeight + window.scrollY >= document.documentElement.scrollHeight;
  17. uuid

    1. export const uuid = () => {
        const temp_url = URL.createObjectURL(new Blob())
        const uuid = temp_url.toString()
        URL.revokeObjectURL(temp_url) //释放这个url
        return uuid.substring(uuid.lastIndexOf('/') + 1)
      }
      
      // 示例
      uuid() // a640be34-689f-4b98-be77-e3972f9bffdd
  18. 存储操作

    1. class MyCache {
        constructor(isLocal = true) {
          this.storage = isLocal ? localStorage : sessionStorage
        }
      
        setItem(key, value) {
          if (typeof (value) === 'object') value = JSON.stringify(value)
          this.storage.setItem(key, value)
        }
      
        getItem(key) {
          try {
            return JSON.parse(this.storage.getItem(key))
          } catch (err) {
            return this.storage.getItem(key)
          }
        }
      
        removeItem(key) {
          this.storage.removeItem(key)
        }
      
        clear() {
          this.storage.clear()
        }
      
        key(index) {
          return this.storage.key(index)
        }
      
        length() {
          return this.storage.length
        }
      }
      
      const localCache = new MyCache()
      const sessionCache = new MyCache(false)
      
      export { localCache, sessionCache }
      
      
      
      // 示例
      localCache.getItem('user')
      sessionCache.setItem('name','树哥')
      sessionCache.getItem('token')
      localCache.clear()
      
      
      
      
  19. 下载文件

    1. /**
      * api 接口
      * params 请求参数
      * fileName 文件名
      **/
      const downloadFile = (api, params, fileName, type = 'get') => {
        axios({
          method: type,
          url: api,
          responseType: 'blob', 
          params: params
        }).then((res) => {
          let str = res.headers['content-disposition']
          if (!res || !str) {
            return
          }
          let suffix = ''
          // 截取文件名和文件类型
          if (str.lastIndexOf('.')) {
            fileName ? '' : fileName = decodeURI(str.substring(str.indexOf('=') + 1, str.lastIndexOf('.')))
            suffix = str.substring(str.lastIndexOf('.'), str.length)
          }
          //  如果支持微软的文件下载方式(ie10+浏览器)
          if (window.navigator.msSaveBlob) {
            try {
              const blobObject = new Blob([res.data]);
              window.navigator.msSaveBlob(blobObject, fileName + suffix);
            } catch (e) {
              console.log(e);
            }
          } else {
            //  其他浏览器
            let url = window.URL.createObjectURL(res.data)
            let link = document.createElement('a')
            link.style.display = 'none'
            link.href = url
            link.setAttribute('download', fileName + suffix)
            document.body.appendChild(link)
            link.click()
            document.body.removeChild(link)
            window.URL.revokeObjectURL(link.href);
          }
        }).catch((err) => {
          console.log(err.message);
        })
      }
      
      
      // 示例
      downloadFile('/api/download', {id}, '文件名');
  20. 深拷贝

    1. 想要完备的深拷贝,推荐使用 lodash 中的 cloneDeep 方法
  21. 模糊检索

    1. /**
      * list 原数组
      * keyWord 查询的关键词
      * attribute 数组需要检索属性
      **/
      export const fuzzyQuery = (list, keyWord, attribute = 'name') => {
        const reg = new RegExp(keyWord)
        const arr = []
        for (let i = 0; i < list.length; i++) {
          if (reg.test(list[i][attribute])) {
            arr.push(list[i])
          }
        }
        return arr
      }
      
      // 示例:
      const list = [
        { id: 1, name: '小哥' },
        { id: 2, name: '黄老爷' },
        { id: 3, name: '张麻子' },
        { id: 4, name: '汤师爷' },
        { id: 5, name: '胡万' },
        { id: 6, name: '花姐' },
        { id: 7, name: '小梅' }
      ]
      fuzzyQuery(list, '哥', 'name') // [{id: 1, name: '小哥'}]
  22. 遍历树节点

    1. export const foreachTree = (data, callback, childrenName = 'children') => {
        for (let i = 0; i < data.length; i++) {
          callback(data[i])
          if (data[i][childrenName] && data[i][childrenName].length > 0) {
            foreachTree(data[i][childrenName], callback, childrenName)
          }
        }
      }
      
      // 示例:
      const treeData = [{
        id: 1,
        label: '一级 1',
        children: [{
          id: 4,
          label: '二级 1-1',
          children: [{
            id: 9,
            label: '三级 1-1-1'
          }, {
            id: 10,
            label: '三级 1-1-2'
          }]
        }]
       }, {
        id: 2,
        label: '一级 2',
        children: [{
          id: 5,
          label: '二级 2-1'
        }, {
          id: 6,
          label: '二级 2-2'
        }]
        }, {
          id: 3,
          label: '一级 3',
          children: [{
            id: 7,
            label: '二级 3-1'
          }, {
            id: 8,
            label: '二级 3-2'
          }]
      }],
      
      let result
      foreachTree(data, (item) => {
        if (item.id === 9) {
          result = item
        }
      })
      console.log('result', result)  // {id: 9,label: "三级 1-1-1"}   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值