美文网首页
20个前端经常使用的函数

20个前端经常使用的函数

作者: wangdemo | 来源:发表于2023-05-11 10:07 被阅读0次

日常开发中,面对各种不同的需求,我们经常会用到以前开发过的一些工具函数,把这些工具函数收集起来,将大大提高我们的开发效率。

1.检验数据类型

export const typeOf = function(obj) {
  return Object.prototype.toString.call(obj).slice(8, -1).toLowerCase()
}
#示例:
typeOf('树哥')  // string
typeOf([])  // array
typeOf(new Date())  // date
typeOf(null) // null
typeOf(true) // boolean
typeOf(() => { }) // function

2.手机号脱敏

export const hideMobile = (mobile) => {
  return mobile.replace(/^(\d{3})\d{4}(\d{4})$/, "$1****$2")
}
#示例:
hideMobile('18721029467')//187****9467

3.大小写转换

参数

  • 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

4.防抖

export const debounce = (() => {
  let timer = null
  return (callback, wait = 800) => {
    timer&&clearTimeout(timer)
    timer = setTimeout(callback, wait)
  }
})()
#示例:
在vue项目中的使用
methods: {
  loadList() {
    debounce(() => {
      console.log('加载数据')
    }, 500)
  }
}

5.节流

export const throttle = (() => {
  let last = 0
  return (callback, wait = 800) => {
    let now = +new Date()
    if (now - last > wait) {
      callback()
      last = now
    }
  }
})()
#示例
 使用方式和防抖一致

6.解析url参数

export const getSearchParams = () => {
  const searchPar = new URLSearchParams(window.location.search)
  const paramsObj = {}
  for (const [key, value] of searchPar.entries()) {
    paramsObj[key] = value
  }
  return paramsObj
}
#示例
//  https://****com/index?id=154513&age=18;
getSearchParams(); // {id: "154513", age: "18"}

7.判断是手机是Andoird还是IOS

/** 
* 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;
}

8.数组对象去重

参数:

  • arr 要去重的数组
  • key 根据去重的字段名
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: '张麻子' }]

9.开启全屏

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()
  }
}

10.关闭全屏

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()
  }
}

11.滚动到顶

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

12.滚动到元素位置

export const smoothScroll = element =>{
    document.querySelector(element).scrollIntoView({
        behavior: 'smooth'
    });
};
#示例
smoothScroll('#target'); // 平滑滚动到 ID 为 target 的元素

13.生成uuid

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
#一般有后端生成

14.金额格式化

参数

  • {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(123455000) // 123,455,000.00
moneyFormat(123456789, 3, '.', '-') // 123-456-789.000

15. localStorage和sessionStorage的存储操作

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('userName')
sessionCache.setItem('name','树哥')
sessionCache.getItem('token')
localCache.clear()

16.下载文件

参数:

  • 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}, '文件名')

17.深拷贝

export const clone = parent => {
  // 判断类型
  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;
  };
// 处理正则
  const getRegExp = re => {
    var flags = "";
    if (re.global) flags += "g";
    if (re.ignoreCase) flags += "i";
    if (re.multiline) flags += "m";
    return flags;
  };
  // 维护两个储存循环引用的数组
  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 (let i in parent) {
      // 递归
      child[i] = _clone(parent[i]);
    }

    return child;
  };
  return _clone(parent);
};
# 更推荐大家使用 lodash 中的 cloneDeep 方法。

18.模糊搜索

参数:

  • 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: '糖包哥哥'}]

19.遍根据某个节点遍历获取其所有父节点

  getAllParentInfo (treeData, nodeId) { // treeData为树结构数组, nodeId为选中的节点
      const temp = []
      const forFn = function (arr, nodeId) {
        arr.map(item => {
          if (item.nodeId === nodeId) {
            temp.unshift(item.nodeName) // 按需获取信息(这里是获取节点名称)
            forFn(tree, item.parentNodeId)
          } else if (item.children.length) {
            forFn(item.children, nodeId)
          }
        })
      }
      forFn(treeData, nodeId)
      return temp
    }

20.遍历树节点

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)
  }
}
}
#示例:
获取树状结构数据中查找 id 为 8 的节点
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(treeData, (item) => {
if (item.id === 9) {
  result = item
}
})
console.log('result', result)  // {id: 8,label: "二级 3-2"} 

相关文章

  • 理解 Debouncing 与 Throttling 的区别

    debounce 与 throttle 是前端开发中经常使用到的高阶函数,都是用来处理 Timing Issues...

  • 五、lodash经常使用的函数

    _.range(10) 生成0到9随机数_.uniqueId() 生成不同的id,用于元素中的id值再好不过_....

  • oneDrive网盘项目开发规范

    前端 技术选型 使用 react , 统一使用函数式组件,Hook 样式编写 全局使用CSS 局部使用styled...

  • 前端JS进阶二(ES6-Class语法)

    Class和普通构造函数有何区别 前端会使用ES6中的Class来代替JS中的构造函数 JS 构造函数 Class...

  • 我和koa的故事

    await与next() 初次使用koa时,前端发送的/build请求都会进入fileRouter.build函数...

  • TB云函数接口

    淘宝的top函数,可以使用前端小程序,也可以使用云函数去调用。为了防止官方api后期更换这边先截图示意下。 官网a...

  • python函数

    Python | 函数(Function) 「 函数定义 」 在编码世界中,函数经常被使用,而且几乎无处不在。看下...

  • 异步和单线程

    前端使用异步的场景 1.setTimeout setInterval函数 2、ajax请求、动态 的加载 3.事件...

  • python operator模块

    在函数式编程中,经常需要把算术运算符当作函数使用。例如,不使用递归计算阶乘。求和可以使用 sum 函数,但是求积则...

  • Excel数据多使用vlookup太慢!使用vlookuptoo

    当我们使用excel检索数据时经常使用vlookup函数进行查找,vlookup函数的强大不用多说,但随着我们检索...

网友评论

      本文标题:20个前端经常使用的函数

      本文链接:https://www.haomeiwen.com/subject/usjcsltx.html