JS工具函数

用于工程化开发,记录,备用

/**
 * 返回 [min, max) 间的随机整数 
 * @param {Number} min 
 * @param {Number} max 
 * @returns {Number}
 */
export function getRandom(min, max) {
  return Math.floor(Math.random() * (max - min) + min)
}

/**
 * 获取随机 rgb 颜色
 * @returns {String}
 */
export function getRandomRgb() {
  return `rgb(${getRandom(0, 256)}, ${getRandom(0, 256)}, ${getRandom(0, 256)})`
}

/**
 * 获取随机 hex 颜色
 * @returns {String}
 */
export function getRandomHex() {
  return '#' + parseInt(Math.random() * 0xffffff).toString(16).padStart(6, '0')
}

/**
 * 返回随机id
 * @returns {String}
 */
export function randomId() {
  const char = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
  let result = ''
  for (let i = 0; i < 16; i++) {
    result += char[getRandom(0, char.length)]
  }
  return result
}

/**
 * 判断一个值是否是Object
 * @param {*} value
 * @returns {Boolean}
 */
export function isObject(value) {
  return Object.prototype.toString.call(value) === '[object Object]'
}

/**
 * 判断value是否为空
 * @param {*} value
 * @returns {Boolean}
 */
export function isEmpty(value) {
  if (value === null || typeof value === 'undefined') {
    return true
  }
  if (typeof value === 'number' && isNaN(value)) {
    return true
  }
  if (typeof value === 'string' && value === '') {
    return true
  }
  if (Array.isArray(value) && value.length <= 0) {
    return true
  }
  if (isObject(value) && Object.keys(value).length <= 0) {
    return true
  }
  return false
}

/**
 * 判断value是否不为空
 * @param {*} value
 * @returns {Boolean}
 */
export function isNotEmpty(value) {
  return !isEmpty(value)
}

/**
 * 将origin中的属性赋值到target中
 * @param {Object} target 目标对象
 * @param {Object} origin 源对象
 * @returns {Object}
 */
export function copyProp(target, origin) {
  if (!isObject(target) || !isObject(origin)) {
    throw new Error('Argument must be of object type!')
  }
  if (isEmpty(origin)) {
    return target
  }
  for (const key in origin) {
    target[key] = origin[key]
  }
  return target
}

/** 深拷贝 */
export function deepClone(value) {
  if (typeof value !== 'object' || isEmpty(value)) {
    return value
  }
  let result = Array.isArray(value) ? [] : {}
  for (const key in value) {
    result[key] = deepClone(value[key])
  }
  return result
}

/**
 * 模拟异步延时
 * @param {Number} [duration=500] 延迟的时间(ms)
 * @returns {Promise}
 */
export function delay(duration = 500) {
  return new Promise((resolve) => setTimeout(resolve, duration))
}

/**
 * 函数只调用一次函数
 * @param {Function} fn
 * @returns {Function}
 */
export function once(fn) {
  let executed = false
  return () => {
    if (!executed) {
      executed = true
      fn.apply(this, ...arguments)
    }
  }
}

/**
 * 防抖
 * @param {Function} fn 要进行防抖的函数
 * @param {Number} [duration=100] 延迟时间
 * @returns {Function}
 */
export function debounce(fn, duration = 100) {
  let timer = null
  return (...args) => {
    clearTimeout(timer)
    timer = setTimeout(() => {
      fn(...args)
    }, duration)
  }
}

/**
 * 节流
 * @param {Function} fn 要节流的函数
 * @param {Number} [duration=50] 延迟时间
 * @returns
 */
export function throttle(fn, duration = 50) {
  let mark = 0
  return () => {
    if (Date.now() - mark >= duration) {
      fn.apply(this, arguments)
      mark = Date.now()
    }
  }
}

/** 返回顶部 */
export function goTop() {
  window.scroll({
    top: 0,
    left: 0,
    behavior: 'smooth',
  })
}

/**
 * 获取url参数
 * @param {String} [url=location.href] url地址,不传使用当前网站url
 * @returns {Object}
 */
export function getUrlParams(url = location.href) {
  const index = url.indexOf('?')
  const result = {}
  if (index === -1) {
    return result
  }
  const arr = url.substring(index + 1).split('&')
  for (let i = 0; i < arr.length; i++) {
    const param = arr[i].split('=')
    result[param[0]] = param[1]
  }
  return result
}

/**
 * 判断dom容器是否有滚动条
 * @param {HTMLElement} [dom=document.body] 容器,不传默认body
 * @returns {Boolean}
 */
export function hasScrollBar(dom) {
  if (dom) {
    const fullHeight = dom.offsetHeight ?? dom.scrollHeight
    return fullHeight > dom.clientHeight
  } else {
    return document.body.scrollHeight > (window.innerHeight || document.documentElement.clientHeight)
  }
}

/**
 * 数组去重
 * @param {Array} arr
 * @returns {Array} 去重后的数组
 */
export function unique(arr) {
  return [...new Set(arr)]
}

/**
 * 数组对象去重
 * @param {Array} arr 要去重的数组
 * @param {String} attr 根据哪个属性去重
 * @returns
 */
export function uniqueByAttr(arr, attr) {
  const attrs = []
  return arr.filter((e) => !attrs.includes(e[attr]) && attrs.push(e[attr]))
}

/**
 * 手机号中间四位数 * 号
 * @param {String} tel
 * @returns
 */
export function hideTel(tel) {
  return tel.replace(/^(\d{3})\d{4}(\d{4})$/, '$1****$2')
}

posted @ 2023-06-10 00:00  摇摆的鱼  阅读(24)  评论(0编辑  收藏  举报