工作中常用的JS函数02

415 阅读2分钟

这是我参与更文挑战的第11天,活动详情查看: 更文挑战

一些常用Javascript函数
  • 相对时间
/**
 * @param {String|Number} timeStamp 时间戳
 * @returns {String} 相对时间字符串
 */
export const getRelativeTime = timeStamp => {
  // 判断当前传入的时间戳是秒格式还是毫秒
  const IS_MILLISECOND = isMillisecond(timeStamp)
  // 如果是毫秒格式则转为秒格式
  if (IS_MILLISECOND) Math.floor(timeStamp /= 1000)
  // 传入的时间戳可以是数值或字符串类型,这里统一转为数值类型
  timeStamp = Number(timeStamp)
  // 获取当前时间时间戳
  const currentTime = Math.floor(Date.parse(new Date()) / 1000)
  // 判断传入时间戳是否早于当前时间戳
  const IS_EARLY = isEarly(timeStamp, currentTime)
  // 获取两个时间戳差值
  let diff = currentTime - timeStamp
  // 如果IS_EARLY为false则差值取反
  if (!IS_EARLY) diff = -diff
  let resStr = ''
  const dirStr = IS_EARLY ? '前' : '后'
  // 少于等于59秒
  if (diff <= 59) resStr = diff + '秒' + dirStr
  // 多于59秒,少于等于59分钟59秒
  else if (diff > 59 && diff <= 3599) resStr = Math.floor(diff / 60) + '分钟' + dirStr
  // 多于59分钟59秒,少于等于23小时59分钟59秒
  else if (diff > 3599 && diff <= 86399) resStr = Math.floor(diff / 3600) + '小时' + dirStr
  // 多于23小时59分钟59秒,少于等于29天59分钟59秒
  else if (diff > 86399 && diff <= 2623859) resStr = Math.floor(diff / 86400) + '天' + dirStr
  // 多于29天59分钟59秒,少于364天23小时59分钟59秒,且传入的时间戳早于当前
  else if (diff > 2623859 && diff <= 31567859 && IS_EARLY) resStr = getDate(timeStamp)
  else resStr = getDate(timeStamp, 'year')
  return resStr
}
  • 当前浏览器名称
/**
 * @returns {String} 当前浏览器名称
 */
export const getExplorer = () => {
  const ua = window.navigator.userAgent
  const isExplorer = (exp) => {
    return ua.indexOf(exp) > -1
  }
  if (isExplorer('MSIE')) return 'IE'
  else if (isExplorer('Firefox')) return 'Firefox'
  else if (isExplorer('Chrome')) return 'Chrome'
  else if (isExplorer('Opera')) return 'Opera'
  else if (isExplorer('Safari')) return 'Safari'
}
  • object是否相同
/**
 * @param {*} obj1 对象
 * @param {*} obj2 对象
 * @description 判断两个对象是否相等,这两个对象的值只能是数字或字符串
 */
export const objEqual = (obj1, obj2) => {
  const keysArr1 = Object.keys(obj1)
  const keysArr2 = Object.keys(obj2)
  if (keysArr1.length !== keysArr2.length) return false
  else if (keysArr1.length === 0 && keysArr2.length === 0) return true
  /* eslint-disable-next-line */
  else return !keysArr1.some(key => obj1[key] != obj2[key])
}
  • localStorage一些方法
import { validatenull } from '@/libs/validate'
import store from 'storejs'
/**
 * 存储localStorage
 */
export const setStore = (params) => {
  let  name = params.name,
    content = params.content,
    type = params.type,
    datetime = params.datetime;
  name = `${process.env.VUE_APP_NAME}-${name}`
  const obj = {
    dataType: typeof (content),
    content: content,
    datetime: new Date().getTime()
  }
  if(type) obj.type = type;
  try {
    if(type){
      window.sessionStorage.setItem(name, JSON.stringify(obj))
    }else{
      // localforage.setItem(name, JSON.stringify(obj))
      store.set(name, JSON.stringify(obj));
    }
  } catch(e){
    console.log(e);
  }

}
/**
 * 获取localStorage
 */
export const getStore = (params) => {
  let {
    name,
    type
  } = params
  let obj = {}
  let content
  name = `${process.env.VUE_APP_NAME}-${name}`
  obj = store.get(name);
  if (validatenull(obj)) obj = window.sessionStorage.getItem(name)
  if (validatenull(obj)) return
  obj = obj?JSON.parse(obj):{}
  if (obj.dataType === 'string') {
    content = obj.content
  } else if (obj.dataType === 'number') {
    content = Number(obj.content)
  } else if (obj.dataType === 'boolean') {
    content = eval(obj.content)
  } else if (obj.dataType === 'object') {
    content = obj.content
  }
  return content
}
/**
 * 删除localStorage
 */
export const removeStore = name => {
  name = `${process.env.VUE_APP_NAME}-${name}`
  store.remove(name)
  window.sessionStorage.removeItem(name)
}

  • 获取文件MD5
//获取文件md5
const getFileMd5 = (file,callback) => {
  let fileReader = new FileReader(),
    //文件每块分割2M,计算分割详情
    chunkSize = 2097152,
    chunks = Math.ceil(file.size / chunkSize),
    currentChunk = 0,
    //创建md5对象(基于SparkMD5)
    spark = new SparkMD5()
  //每块文件读取完毕之后的处理
  fileReader.onload = function (e) {
    //每块交由sparkMD5进行计算
    spark.appendBinary(e.target.result)
    currentChunk++
    //如果文件处理完成计算MD5,如果还有分片继续处理
    if (currentChunk < chunks) {
      loadNext()
    } else {
      callback(spark.end())
    }
  }
  //处理单片文件的上传
  function loadNext () {
    var start = currentChunk * chunkSize,
      end = start + chunkSize >= file.size ? file.size : start + chunkSize

    fileReader.readAsBinaryString(file.slice(start, end))
  }
  loadNext()
};
  • 以上所述是给大家介绍的详解JS,希望对大家有所帮助