一些实用的JavaScript小方法

157 阅读1分钟
/**
 * [生成一个uuid]
 *
 * @return {String} 生成的uuid
 * @example
 * > createUuid()
 * < 'a0671ce4-a34f-4374-b074-9c606fb0d1d8'
 */
const createUuid = () => {
  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (t) {
    const e = 16 * Math.random() | 0;
    return ('x' === t ? e : 3 & e | 8).toString(16)
  })
}

/**
 * [获取当前对象类型]
 *
 * @param {*} o 当前对象
 * @return {String} 类型
 * @example
 * > type('hello world')
 * < string
 */
function type(o) {
  let result = 'unknown'
  try {
    result = Object.prototype.toString.call(o).slice(8, -1).toLowerCase()
  } catch(err) { }
  return result
}

/**
 * [获取一个十六进制的缓存时间戳]
 *
 * @param {Number} second 缓存时间(秒)
 * @return {String} 一个十六进制的时间戳: 1d9901ada
 * @example
 * > createCacheTime(5)
 * < '12f150f0'
 */
function createCacheTime(second) {
  return parseInt(
    now() /
    (1e3 * (Number(second) || 0.2))
  ).toString(16)
}

/**
 * [WAP端实现模板赋值]
 *
 * @params {Array} chunks
 * @example
 * > updateByPath(a, 'b[1].c', true)
 * < [ ]
 */
function updateByPath(origin, path, value) {
  try {
    const target = path.replace(/]/g, '').split(/\[|\./)
    const length = target.length
    let current = origin

    for (let i = 0; i < length; i++) {
      if (i === length - 1) {
        current[target[i]] = value
      } else {
        current = current[target[i]]
      }
    }
  } catch(err) { }
}

/**
 * [版本号比较]
 *
 * @description 后者相对前者版本号更高
 * @params {String} version1
 * @params {String} version2
 * @return {Boolean} true or false
 * @example
 * > compareVersion('1.2.2.0', '0.2.0.0')
 * < false
 */
function compareVersion(version1, version2) {
  let result = false
  try {
    const version1Arr = version1.split('.')
    const version2Arr = version2.split('.')
    if (version1Arr.length === version2Arr.length) {
      const version1Fix = version1Arr.map((item) => item.padStart(4, 0)).join('')
      const version2Fix = version2Arr.map((item) => item.padStart(4, 0)).join('')
      result = parseInt(version1Fix) > parseInt(version2Fix)
    } else {
      throw '版本号长度不一致'
    }
  } catch (err) {
    console.error(err)
  }
  return result
}

const HOUR_TO_MILL = 60 * 60 * 1e3 // 3600000

/**
 * [获取当前时间]
 *
 * @return {Number} 时间戳
 * @example
 * > now()
 * < 1589023951368
 */
const now = () => +new Date

/**
 * [获取当天开始时间]
 *
 * @return {Number} 时间戳
 * @example
 * > getCurrentDayStartTime()
 * < 1614614400000
 */
const getCurrentDayStartTime = () => {
  const currentTime = now()
  return currentTime - (currentTime % (HOUR_TO_MILL * 24)) - (HOUR_TO_MILL * 8)
}

/**
 * [获取当天结束时间]
 *
 * @return {Number} 时间戳
 * @example
 * > getCurrentDayEndTime()
 * < 1614700800000
 */
const getCurrentDayEndTime = () => {
  const currentTime = now()
  return currentTime - (currentTime % (HOUR_TO_MILL * 24)) + (HOUR_TO_MILL * 16)
}

/**
 * [获取当天已过时间(毫秒)]
 *
 * @return {Number} 时间戳
 * @example
 * > getCurrentDayUsedMill()
 * < 40466936
 */
const getCurrentDayUsedMill = () => now() - getCurrentDayStartTime()

/**
 * [获取当天剩余时间(毫秒)]
 *
 * @return {Number} 时间戳
 * @example
 * > getCurrentDayRemainMill()
 * < 45893446
 */
const getCurrentDayRemainMill = () => getCurrentDayEndTime() - now()

/**
 * [获取当天已过时间(秒)]
 *
 * @return {Number} 时间戳
 * @example
 * > getCurrentDayUsedSecond()
 * < 40539
 */
const getCurrentDayUsedSecond = () => {
  const currentTime = now()
  return (currentTime - (currentTime % 1e3) - getCurrentDayStartTime()) / 1e3
}

/**
 * [获取当天剩余时间(秒)]
 *
 * @return {Number} 时间戳
 * @example
 * > getCurrentDayRemainSecond()
 * < 45835
 */
const getCurrentDayRemainSecond = () => {
  const currentTime = now()
  return (getCurrentDayEndTime() - (currentTime - currentTime % 1e3)) / 1e3
}