util.js 8.81 KB
/**
 * Parse the time to string
 * @param {(Object|string|number)} time
 * @param {string} cFormat
 * @returns {string}
 */
export function parseTime(time, cFormat) {
  if (arguments.length === 0) {
    return null
  }
  const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}'
  let date
  if (typeof time === 'object' && time) {
    date = time
  } else {
    if (typeof time === 'string' && /^[0-9]+$/.test(time)) {
      time = parseInt(time)
    }
    if (typeof time === 'number' && time.toString().length === 10) {
      time = time * 1000
    }
    date = new Date(time)
  }
  const formatObj = {
    y: date.getFullYear(),
    m: date.getMonth() + 1,
    d: date.getDate(),
    h: date.getHours(),
    i: date.getMinutes(),
    s: date.getSeconds(),
    a: date.getDay()
  }
  const timeStr = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
    let value = formatObj[key]
    // Note: getDay() returns 0 on Sunday
    if (key === 'a') {
      return ['日', '一', '二', '三', '四', '五', '六'][value]
    }
    if (result.length > 0 && value < 10) {
      value = '0' + value
    }
    return value || 0
  })
  return timeStr
}

/**
 * @param {string} url
 * @returns {Object}
 */
export function getQueryObject(url) {
  url = url == null ? window.location.href : url
  const search = url.substring(url.lastIndexOf('?') + 1)
  const obj = {}
  const reg = /([^?&=]+)=([^?&=]*)/g
  search.replace(reg, (rs, $1, $2) => {
    const name = decodeURIComponent($1)
    let val = decodeURIComponent($2)
    val = String(val)
    obj[name] = val
    return rs
  })
  return obj
}

/**
 * @param {string} input value
 * @returns {number} output value
 */
export function byteLength(str) {
  // returns the byte length of an utf8 string
  let s = str.length
  for (var i = str.length - 1; i >= 0; i--) {
    const code = str.charCodeAt(i)
    if (code > 0x7f && code <= 0x7ff) s++
    else if (code > 0x7ff && code <= 0xffff) s += 2
    if (code >= 0xdc00 && code <= 0xdfff) i--
  }
  return s
}

/**
 * @param {Array} actual
 * @returns {Array}
 */
export function cleanArray(actual) {
  const newArray = []
  for (let i = 0; i < actual.length; i++) {
    if (actual[i]) {
      newArray.push(actual[i])
    }
  }
  return newArray
}

/**
 * @param {Object} json
 * @returns {Array}
 */
export function param(json) {
  if (!json) return ''
  return cleanArray(
    Object.keys(json).map(key => {
      if (json[key] === undefined) return ''
      return encodeURIComponent(key) + '=' + encodeURIComponent(json[key])
    })
  ).join('&')
}

/**
 * @param {string} url
 * @returns {Object}
 */
export function param2Obj(url) {
  const search = url.split('?')[1]
  if (!search) {
    return {}
  }
  return JSON.parse(
    '{"' +
      decodeURIComponent(search)
        .replace(/"/g, '\\"')
        .replace(/&/g, '","')
        .replace(/=/g, '":"')
        .replace(/\+/g, ' ') +
      '"}'
  )
}

/**
 * Merges two objects, giving the last one precedence
 * @param {Object} target
 * @param {(Object|Array)} source
 * @returns {Object}
 */
export function objectMerge(target, source) {
  if (typeof target !== 'object') {
    target = {}
  }
  if (Array.isArray(source)) {
    return source.slice()
  }
  Object.keys(source).forEach(property => {
    const sourceProperty = source[property]
    if (typeof sourceProperty === 'object') {
      target[property] = objectMerge(target[property], sourceProperty)
    } else {
      target[property] = sourceProperty
    }
  })
  return target
}

/**
 * @param {string} type
 * @returns {Date}
 */
export function getTime(type) {
  if (type === 'start') {
    return new Date().getTime() - 3600 * 1000 * 24 * 90
  } else {
    return new Date(new Date().toDateString())
  }
}

/**
 * @param {Function} func
 * @param {number} wait
 * @param {boolean} immediate
 * @return {*}
 */
export function debounce(func, wait, immediate) {
  let timeout, args, context, timestamp, result

  const later = function() {
    // 据上一次触发时间间隔
    const last = +new Date() - timestamp

    // 上次被包装函数被调用时间间隔 last 小于设定时间间隔 wait
    if (last < wait && last > 0) {
      timeout = setTimeout(later, wait - last)
    } else {
      timeout = null
      // 如果设定为immediate===true,因为开始边界已经调用过了此处无需调用
      if (!immediate) {
        result = func.apply(context, args)
        if (!timeout) context = args = null
      }
    }
  }

  return function(...args) {
    context = this
    timestamp = +new Date()
    const callNow = immediate && !timeout
    // 如果延时不存在,重新设定延时
    if (!timeout) timeout = setTimeout(later, wait)
    if (callNow) {
      result = func.apply(context, args)
      context = args = null
    }

    return result
  }
}

/**
 * 节流
 * @param {*} func
 * @param {*} wait
 * @param {*} immediate
 */
export function throttle(fn, wait = 1000, immediate) {
  let timer = null
  let callNow = immediate
  return function(...args) {
    let context = this
    if (callNow) {
      fn.apply(context, args)
      callNow = null
    }
    if (!timer) {
      timer = setTimeout(() => {
        fn.apply(context, args)
        timer = null
      }, wait)
    }
  }
}

/**
 * @param {Array} arr
 * @returns {Array}
 */
export function uniqueArr(arr) {
  return Array.from(new Set(arr))
}

/**
 * @returns {string}
 */
export function createUniqueString() {
  const timestamp = +new Date() + ''
  const randomNum = parseInt((1 + Math.random()) * 65536) + ''
  return (+(randomNum + timestamp)).toString(32)
}
/**
 * 延迟执行某个操作
 * @param {} ms
 */
export function timeout(ms) {
  return new Promise((resolve, reject) => {
    setTimeout(resolve, ms, 'done')
  })
}
/**
 * 二进制转文件
 * @param {*} blobs blob对象
 * @param {*} fileName 文件名
 */
export function blob2File(blobs, fileName) {
  const blob = new Blob([blobs])
  const href = window.URL.createObjectURL(blob) // 创建下载的链接
  const aEle = document.createElement('a') // 创建a标签
  aEle.href = href
  aEle.download = fileName // 下载后文件名
  document.body.appendChild(aEle)
  aEle.click() // 点击下载
  document.body.removeChild(aEle) // 下载完成移除元素
  window.URL.revokeObjectURL(href) // 释放掉blob对象
}
/**
 * url下载文件
 * @param {*} url
 * @param {*} name
 */
export function downFile(url, name) {
  const a = document.createElement('a')
  a.href = url
  a.download = name
  document.body.appendChild(a)
  a.click()
  document.body.removeChild(a)
}

/**
 * 对象转换成formdata形式
 * @param {*} data
 */
export function obj2FormData(data) {
  const form = new FormData()
  Object.keys(data).forEach(key => {
    if (data[key] !== undefined) {
      form.append(key, data[key])
    }
  })
  return form
}
function typeOf(obj) {
  const toString = Object.prototype.toString
  const map = {
    '[object Boolean]': 'boolean',
    '[object Number]': 'number',
    '[object String]': 'string',
    '[object Null]': 'null',
    '[object Undefined]': 'undefined',
    '[object Symbol]': 'symbol',
    '[object Object]': 'object',
    '[object Function]': 'function',
    '[object Array]': 'array',
    '[object Date]': 'date',
    '[object RegExp]': 'regexp'
  }
  return map[toString.call(obj)]
}
/**
 * 深克隆
 * @param {*} data
 */
export function deepClone(data) {
  const type = typeOf(data)
  let copy
  if (type === 'array') {
    copy = []
  } else if (type === 'object') {
    copy = {}
  } else {
    return data
  }
  if (type === 'array') {
    for (let i = 0; i < data.length; i++) {
      copy.push(deepClone(data[i]))
    }
  }
  if (type === 'object') {
    for (let key in data) {
      copy[key] = deepClone(data[key])
    }
  }
  return copy
}

/**
 * filter undefined
 * @param {*} temp
 */
export function parseUndefined(temp) {
  // 判断是否为0
  if (temp === 0 || temp === '0') {
    return temp
  }
  if (temp) {
    return temp
  } else {
    return undefined
  }
}
/**
 * 获取目标的元素的截图
 * @param {*} target
 * @param {*} format
 */
export function shotTargetToImage(target, format) {
  const canvas = document.createElement('canvas') // 创建画布
  canvas.width = target.videoWidth
  canvas.height = target.videoHeight // 设定宽高比
  canvas.getContext('2d').drawImage(target, 0, 0, canvas.width, canvas.height) // 将视频此刻帧数画入画布
  return canvas.toDataURL(format)
}

// 去掉base头部
export function substringBasehead(base64) {
  let length = 'data:image/png;base64,'.length
  return base64.substring(length)
}

export function parseTimeSecond(time) {
  let minutes = parseInt((time % (1000 * 60 * 60)) / (1000 * 60))
  let second = parseInt((time % (1000 * 60)) / 1000)
  if (minutes < 10) {
    minutes = `0${minutes}`
  }
  if (second < 10) {
    second = `0${second}`
  }
  return `${minutes}:${second}`
}

export function sleep(time) {
  return new Promise(resolve => {
    setTimeout(resolve, time)
  })
}