js常用方法

1.后端返回文件流下载excel操作?

// 接口地址
export const ecoResProjectExportExcel = data => request({ url: '/ecoResProject/exportExcel', method: 'post', data, responseType: 'arraybuffer' })
/* 数据导出 */
    clickexport () {
      let deletearr = [...this.tableSelection]
      this.loadingDc = true
      dataEconomicsExportExcel({
        aeIds: deletearr.map(val => val.aeId)
      }).then(res => {
        if (res.status === 200) {
          const tempBlob = new Blob([ res.data ], { type: 'application/json' })
          // 通过 FileReader 读取这个 blob
          const reader = new FileReader()
          reader.onload = e => {
            const res1 = e.target.result
            // 此处对fileReader读出的结果进行JSON解析
            // 可能会出现错误,需要进行捕获
            try {
              const json = JSON.parse(res1)
              for (const key in json) {
                if (json[key] === 1009) {
                  this.$router.push({
                    path: '/login'
                  })
                }
              }
            } catch (err) {
              this.loadingDc = false
              const link = document.createElement('a')
              let blob = new Blob([res.data], { type: 'application/vnd.ms-excel' })
              link.style.display = 'none'
              link.href = URL.createObjectURL(blob)
              // link.href = config.eprUrl +'/'+ res.data.data
              // link.download = res.headers['content-disposition'].split('')[1].split(';')[1] // 下载后文件名
              link.download = '社会经济' + res.headers['content-disposition'].split(';')[1].split('=')[1]
              document.body.appendChild(link)
              link.click()
              document.body.removeChild(link)
              this.tableSelection = []
            }
          }
          // 将blob对象以文本的方式读出,读出完成后将会执行 onload 方法
          reader.readAsText(tempBlob)
        } else {
          this.$Notice.info({
            title: '导出失败'
          })
        }
      }).catch((error) =>
        console.log(error)
      )
    },

 

2.经纬度和度分秒互相转换?

/* 转换经纬度为度分秒 */
export const cacuLonLat = a => {
  if (a === undefined || a === null) {
    return undefined
  } else {
    let degree = parseInt(a)
    let min = parseInt((a - degree) * 60)
    let sec = ((a - degree) * 3600 - min * 60).toFixed(2)

    let min00 = '00' + min
    min = min00.substring(min00.length - 2, min00.length)

    return degree + '°' + min + '′' + sec + '″'
  }
}

// 度分秒转经纬度   48°33´13.70"
export const DegreeConvertBack = val => {
  let du = val.split('°')[0]
  let fen = val.split('°')[1].split('´')[0]
  let miao = val.split('°')[1].split('´')[1].split('"')[0]
  return parseFloat(Math.abs(du)) + parseFloat((Math.abs(fen) / 60) + parseFloat(Math.abs(miao) / 3600))
}

 

 

3.数字每3位加,?

/* 将数字每三位加 ,  */
export const toThousands = (num) => {
  let result = ''
  let counter = 0
  num = (num || 0).toString()
  for (let i = num.length - 1; i >= 0; i--) {
    counter++
    result = num.charAt(i) + result
    if (!(counter % 3) && i !== 0) {
      result = ',' + result
    }
  }
  return result
}

 

 

4.日期转换格式?

/* 日期格式装换 */
export const renderTime = date => {
  if (date === null || date === undefined|| date === '') {
    return ''
  }
  let d = new Date(date)
  let month = d.getMonth() + 1
  if (month < 10) {
    month = '0' + month
  }
  let date1 = d.getDate()
  if (date1 < 10) {
    date1 = '0' + date1
  }
  let times = d.getFullYear() + '-' + month + '-' + date1
  return times
}

/* 年份格式装换 */
export const renderYearTime = date => {
  if (date === null || date === undefined) {
    return ''
  }
  let d = new Date(date)
  let times = d.getFullYear()
  return times
}

/* 日期格式装换-- 精确到秒 */
export const renderDateTime = date => {
  if (date === null || date === undefined) {
    return ''
  }
  let d = new Date(date)
  let times = d.getFullYear() + '-' + (d.getMonth() + 1) + '-' + d.getDate() + ' ' + d.getHours() + ':' + d.getMinutes() + ':' + d.getSeconds()
  return times
}

 

 

5.v-resize监控div长宽的变化?

// vue中的自定义指令
// v-resize监控div长宽的变化
Vue.directive('resize', {
  bind (el, binding) {
    let width = ''
    let height = ''
    function get () {
      const style = document.defaultView.getComputedStyle(el)
      if (width !== style.width || height !== style.height) {
        binding.value({ width, height })
      }
      width = style.width
      height = style.height
    }

    el.__vueReize__ = setInterval(get, 200)
  },
  unbind (el) {
    clearInterval(el.__vueReize__)
  }
})

 

 

6.判断一个数组对象里面的值是否为空?

judgeObjectComplete (ObjectValue) {
      let flag = new Boolean()
      flag = true
      for (let key in ObjectValue) {
        if (ObjectValue[key]) {
          return
        } else {
          flag = false
        }
      }
      if (!flag) {
        return false
      } else {
        return true
      }
    },
    judgeListComplete (list) {
      let isNotComplete = list.findIndex(item => {
        return this.judgeObjectComplete(item) === false
      })
      console.log(isNotComplete)
      if (isNotComplete > -1) {
        return false
      } else {
        return true
      }
    },
    // 调用 this.judgeListComplete()  返回布尔值(true或 false)

 

 

7.常用的格式校验?

//校验手机号码
export function isSpecialPhone(num) {
  return /^1[2,3,4,5,7,8]\d{9}$/.test(num)
}

//校验中英文姓名
export function isName(name) {
  return /[a-zA-Z\u4E00-\u9FA5]+$/.test(name)
}

// 邮箱的校验
/^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/

// 校验身份证号码
/^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$|^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/;

// 经度的校验   经度: -180.0~+180.0(整数部分为0~180,必须输入1到5位小数)
/^[\-\+]?(0?\d{1,2}\.\d{1,5}|1[0-7]?\d{1}\.\d{1,5}|180\.0{1,5})$/

// 纬度的校验   纬度: -90.0~+90.0(整数部分为0~90,必须输入1到5位小数)
/^[\-\+]?([0-8]?\d{1}\.\d{1,5}|90\.0{1,5})$/

// 纯文字校验
let reg = /^([\u4e00-\u9fa5])*$/;

 

8.倒计时(默认是当前时间)?

* 倒计时(默认开始时间为当前时间)
 * @param endTime 结束时间
 * @returns 时间对象
 */
const getEndTime = (startTime, endTime) => {
  const startDate = startTime || new Date(); //开始时间,当前时间
  const endDate = new Date(endTime); //结束时间,需传入时间参数
  const t = endDate.getTime() - startDate.getTime(); //时间差的毫秒数
  let d = 0,
    h = 0,
    m = 0,
    s = 0;
  if (t >= 0) {
    d = Math.floor(t / 1000 / 3600 / 24) > 10 ? Math.floor(t / 1000 / 3600 / 24) : '0' + Math.floor(t / 1000 / 3600 / 24);
    h = Math.floor(t / 1000 / 60 / 60 % 24) > 10 ? Math.floor(t / 1000 / 60 / 60 % 24) > 10 : '0' + Math.floor(t / 1000 / 60 / 60 % 24) > 10;
    m = Math.floor(t / 1000 / 60 % 60) > 10 ? Math.floor(t / 1000 / 60 % 60) : '0' + Math.floor(t / 1000 / 60 % 60);
    s = Math.floor(t / 1000 % 60) > 10 ? Math.floor(t / 1000 % 60) : '0' + Math.floor(t / 1000 % 60);
  }
  return {
    day: d,
    hour: h,
    minute: m,
    second: s
  }
}

 

 

9.压缩图片?

dealImage (path, obj, callback) {
        var img = new Image()
        img.src = path
        img.onload = function () {
          var that = this
          // 默认按比例压缩
          var w = that.width
          var h = that.height
          var scale = w / h
          w = obj.width || w
          h = obj.height || w / scale
          var quality = 0.5 // 默认图片质量为0.7
          // 生成canvas
          var canvas = document.createElement('canvas')
          var ctx = canvas.getContext('2d')
          // 创建属性节点
          var anw = document.createAttribute('width')
          anw.nodeValue = w
          var anh = document.createAttribute('height')
          anh.nodeValue = h
          canvas.setAttributeNode(anw)
          canvas.setAttributeNode(anh)
          ctx.drawImage(that, 0, 0, w, h)
          // 图像质量
          if (obj.quality && obj.quality <= 1 && obj.quality > 0) {
            quality = obj.quality
          }
          // quality值越小,所绘制出的图像越模糊
          var base64 = canvas.toDataURL('image/jpeg', quality)
          // 回调函数返回base64的值
          callback(base64)
        }
      }

 

 

10.图片转成base64?

getImgData (img, dir, next) {
        var image = new Image()
        image.onload = function () {
          var degree = 0
          var drawWidth
          var drawHeight
          var width
          var height
          drawWidth = this.naturalWidth
          drawHeight = this.naturalHeight
          // 以下改变一下图片大小
          var canvas = document.createElement('canvas')
          canvas.width = width = drawWidth
          canvas.height = height = drawHeight
          var context = canvas.getContext('2d')
          // 判断图片方向,重置canvas大小,确定旋转角度,iphone默认的是home键在右方的横屏拍摄方式
          switch (dir) {
            // iphone横屏拍摄,此时home键在左侧
            case 3:
              degree = 180
              drawWidth = -width
              drawHeight = -height
              break
            // iphone竖屏拍摄,此时home键在下方(正常拿手机的方向)
            case 6:
              canvas.width = height
              canvas.height = width
              degree = 90
              drawWidth = width
              drawHeight = -height
              break
            // iphone竖屏拍摄,此时home键在上方
            case 8:
              canvas.width = height
              canvas.height = width
              degree = 270
              drawWidth = -width
              drawHeight = height
              break
          }
          // 使用canvas旋转校正
          context.rotate((degree * Math.PI) / 180)
          context.drawImage(this, 0, 0, drawWidth, drawHeight)
          // 返回校正图片
          next(canvas.toDataURL('image/jpeg', 0.8))
        }
        image.src = img
      }

 

 

11.纯前端的表格转excel

<script>

npm install file-saver --save // 安装
import FileSaver from "file-saver"
npm install xlsx // 安装
import XLSX from "xlsx"

exportExcel() {
            /*获取表格数据 */
            var wb = XLSX.utils.book_new()
            var centers = XLSX.utils.table_to_sheet(document.querySelector("#center_table"))
            var products = XLSX.utils.table_to_sheet(document.querySelector("#product_table"))
            var center_month = XLSX.utils.table_to_sheet(document.querySelector("#center_table_month"))
            var departs = XLSX.utils.table_to_sheet(document.querySelector("#depart_table"))

            /* 添加多个工作薄,如果只有一个,则只写一个 */
            XLSX.utils.book_append_sheet(wb, center_month, "各中心月度费用统计")
            XLSX.utils.book_append_sheet(wb, centers, "各中心申请费用类型统计")
            XLSX.utils.book_append_sheet(wb, products, "各业务产品申请费用统计")
            XLSX.utils.book_append_sheet(wb, departs, "各部门申请费用统计")
            /* 使用iview表格时删除最后一行 */
            for (let key in centers) {
                if (key.includes('A')) {
                  if (one[key].v === '暂无筛选结果') {
                    delete one[key]
                  }
                }
              }
            var wbout = XLSX.write(wb, {
                bookType: "xlsx",
                bookSST: true,
                type: "array"
            })
            try {
                FileSaver.saveAs(
                    // Blob 对象表示一个不可变、原始数据的类文件对象。
                    // Blob 表示的不一定是JavaScript原生格式的数据。
                    // File 接口基于Blob,继承了 blob 的功能并将其扩展使其支持用户系统上的文件。
                    // 返回一个新创建的 Blob 对象,其内容由参数中给定的数组串联组成。
                    new Blob([wbout], { type: "application/octet-stream" }),
                    // 设置导出文件名称 xxx.xlsx
                    "中心申请费用类型统计.xlsx"
                )
            } catch (e) {
                if (typeof console !== "undefined") console.log(e, wbout)
            }
            return wbout
        },

</script

 

 

20.解析Blob内容并下载?

/**
 * 解析blob响应内容并下载
 * @param {*} res blob响应内容
 * @param {String} mimeType MIME类型
 */
export function resolveBlob(res, mimeType) {
  const aLink = document.createElement('a')
  var blob = new Blob([res.data], { type: mimeType })
  // //从response的headers中获取filename, 后端response.setHeader("Content-disposition", "attachment; filename=xxxx.docx") 设置的文件名;
  var patt = new RegExp('filename=([^;]+\\.[^\\.;]+);*')
  var contentDisposition = decodeURI(res.headers['content-disposition'])
  var result = patt.exec(contentDisposition)
  var fileName = result[1]
  fileName = fileName.replace(/\"/g, '')
  aLink.href = URL.createObjectURL(blob)
  aLink.setAttribute('download', fileName) // 设置下载文件名称
  document.body.appendChild(aLink)
  aLink.click()
  document.body.appendChild(aLink)
}

 

 

21.数组按首字母进行排序?

第一种方法:
  obj.sort((a,b)=>{a.pinyin.charCodeAt(0)-b.pinyin.charCodeAt(0)})
第二种方法:
  sort((a,b)=>a.pinyin.localeCompare(b.pinyin))

 

 

 

 

 

 

posted @ 2022-01-28 17:13  皓皓102  阅读(27)  评论(0编辑  收藏  举报