js 方法整理

322 阅读3分钟

时间戳转换为时分

export function timestampHM (time) {
  let hours = parseInt((time % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60))
  let minutes = parseInt((time % (1000 * 60 * 60)) / (1000 * 60))
  let seconds = parseInt((time % (1000 * 60)) / 1000)
  hours = hours < 10 ? ('0' + hours) : hours
  minutes = minutes < 10 ? ('0' + minutes) : minutes
  seconds = seconds < 10 ? ('0' + seconds) : seconds
  return `${hours}:${minutes}:${seconds}`
}

时间戳转换为时间

export function timestampToTime (timestamp, type) {
  if (!timestamp) {
    return
  }
  let date = new Date(timestamp) // 时间戳为10位需*1000,时间戳为13位的话不需乘1000
  let Y = date.getFullYear() + '-'
  let M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-'
  let D = lessTen(date.getDate()) + ' '
  let h = lessTen(date.getHours()) + ':'
  let m = lessTen(date.getMinutes()) + ':'
  let s = lessTen(date.getSeconds())
  return type === 'date' ? Y + M + D : Y + M + D + h + m + s
}

canvas海报处理方法

/**
 * @description: 绘制正方形(可以定义圆角),并且有图片地址的话填充图片
 * @param {CanvasContext} ctx canvas上下文
 * @param {number} x 圆角矩形选区的左上角 x坐标
 * @param {number} y 圆角矩形选区的左上角 y坐标
 * @param {number} w 圆角矩形选区的宽度
 * @param {number} h 圆角矩形选区的高度
 * @param {number} r 圆角的半径
 * @param {String} url 图片的url地址
 */
 
 export function drawSquarePic(ctx, x, y, w, h, r, url) {
  ctx.save()
  ctx.beginPath()
  // 绘制左上角圆弧
  ctx.arc(x + r, y + r, r, Math.PI, Math.PI * 1.5)
  // 绘制border-top
  // 画一条线 x终点、y终点
  ctx.lineTo(x + w - r, y)
  // 绘制右上角圆弧
  ctx.arc(x + w - r, y + r, r, Math.PI * 1.5, Math.PI * 2)
  // 绘制border-right
  ctx.lineTo(x + w, y + h - r)
  // 绘制右下角圆弧
  ctx.arc(x + w - r, y + h - r, r, 0, Math.PI * 0.5)
  // 绘制左下角圆弧
  ctx.arc(x + r, y + h - r, r, Math.PI * 0.5, Math.PI)
  // 绘制border-left
  ctx.lineTo(x, y + r)
  // 填充颜色(需要可以自行修改)
  ctx.setFillStyle('#ffffff')
  ctx.fill()
  // 剪切,剪切之后的绘画绘制剪切区域内进行,需要save与restore 这个很重要 不然没办法保存
  ctx.clip()
  // 绘制图片
  return new Promise((resolve, reject) => {
    if (url) {
      // const regexp = /^https?:\/\/(([a-zA-Z0-9_-])+(\.)?)*(:\d+)?(\/((\.)?(\?)?=?&?[a-zA-Z0-9_-](\?)?)*)*$/i
      const handleUrl=(res)=>{
        ctx.drawImage(res.path, x, y, w, h)
        ctx.restore() //恢复之前被切割的canvas,否则切割之外的就没办法用
        ctx.draw(true)
        resolve()
      }
      const handleFail = (res) => {
        uni.showToast({
          title: '图片下载异常',
          duration: 2000,
          icon: 'none'
        })
        ctx.restore()
        ctx.draw(true)
        resolve()
      }
       uni.downloadFile({
        url: url,
	success(res) {
	if(res.statusCode !== 200) {
            handleFail(res)
	} else {
           handleUrl({path: res.tempFilePath})
	}
         },
         fail(res) {
           handleFail(res)
         }
       })
    } else {
      ctx.restore()
      ctx.draw(true)
      resolve()
    }
  })
}

canvas 绘制文本

/**
 * @description: 绘制文本时文本的总体高度
 * @param {Object} ctx canvas上下文
 * @param {String} text 需要输入的文本
 * @param {Number} x X轴起始位置
 * @param {Number} y Y轴起始位置
 * @param {Number} maxWidth 单行最大宽度
 * @param {Number} fontSize 字体大小
 * @param {String} color 字体颜色
 * @param {Number} lineHeight 行高
 * @param {String} textAlign 字体对齐方式
*/
  export function drawTextReturnH(
  ctx,
  text,
  x,
  y,
  maxWidth = 375,
  fontSize = 14,
  color = '#000',
  lineHeight = 30,
  textAlign = 'left',
) {
  if (textAlign) {
    ctx.setTextAlign(textAlign) //设置文本的水平对齐方式  ctx.setTextAlign这个可以兼容百度小程序 ,注意:ctx.textAlign百度小程序有问题
    switch (textAlign) {
      case 'center':
        x = getSystem().w / 2
        break
      case 'right':
        x = (getSystem().w - maxWidth) / 2 + maxWidth
        break
      case 'left':
        x = (getSystem().w - maxWidth) / 2
        break
      default:
        break
    }
  }
  let arrText = text.split('')
  let line = ''
  for (let n = 0; n < arrText.length; n++) {
    let testLine = line + arrText[n]
    ctx.font = fontSize + 'px sans-serif' //设置字体大小,注意:百度小程序 用ctx.setFontSize设置字体大小后,计算字体宽度会无效
    ctx.setFillStyle(color) //设置字体颜色
    let metrics = ctx.measureText(testLine) //measureText() 方法返回包含一个对象,该对象包含以像素计的指定字体宽度。
    let testWidth = metrics.width
    if (testWidth > maxWidth && n > 0) {
      ctx.fillText(line, x, y)
      line = arrText[n]
      y += lineHeight
    } else {
      line = testLine
    }
  }
  ctx.fillText(line, (arrText.length < 4 ? x + fontSize : x), y + lineHeight)
  ctx.draw(true) //本次绘制是否接着上一次绘制。即 reserve 参数为 false,则在本次调用绘制之前 native 层会先清空画布再继续绘制;若 reserve 参数为 true,则保留当前画布上的内容,本次调用 drawCanvas 绘制的内容覆盖在上面,默认 false。
  return y
}

定位坐标计算

function handlerZeroDistance(aqn, cwh, returnObj ,key) {
  if(key){
    returnObj[key] = {...aqn}
  }
  for(let keys in aqn){
    if( typeof aqn[keys] ==='object') {
      handlerZeroDistance(aqn[keys],cwh,returnObj,keys)
    } else {
      returnObj[key][keys] = {...aqn[keys]}
      if(keys === 'x' && aqn[keys] !== 0){
        if(aqn[keys] > (225 / 2)) {
          returnObj[key][keys] = aqn[keys] + cwh.cxtw
        } else if (aqn[keys] < (225 / 2)) {
          returnObj[key][keys]= aqn[keys] + (cwh.cxtw / 2)
        }
      } else if(keys === 'x' && aqn[keys] === 0) {
        returnObj[key][keys] = aqn[keys]
      }
      if(keys === 'y' && aqn[keys] !== 0) {
        if (aqn[keys] > (400 / 2)) {
          returnObj[key][keys] = aqn[keys] + cwh.cxth
        } else if(aqn[keys] < (400 / 2)){
          returnObj[key][keys] = aqn[keys] + (cwh.cxth / 2)
        }
      } else if(keys === 'y' && aqn[keys] === 0) {
          returnObj[key][keys] = aqn[keys]
      }
    }
  }
}

图片转行为base64

 export function getImageBase64 (imgUrl) {
  return new Promise((resolve, reject) => {
    window.URL = window.URL ?? window.webkitURL
    var xhr = new XMLHttpRequest()
    xhr.open('get', imgUrl, true)
    // 至关重要
    xhr.responseType = 'blob'
    xhr.onload = function () {
      if (this.status == 200) {
        //得到一个blob对象
        var blob = this.response
        // 至关重要
        let oFileReader = new FileReader()
        oFileReader.onloadend = function (e) {
          // 此处拿到的已经是 base64的图片了
          let base64 = e.target.result
          resolve(base64)
        }
        oFileReader.readAsDataURL(blob)
        //====为了在页面显示图片,可以删除====
        var img = document.createElement('img')
        img.onload = function (e) {
          window.URL.revokeObjectURL(img.src) // 清除释放
        }
        let src = window.URL.createObjectURL(blob)
        img.src = src
        // document.getElementById("container1").appendChild(img);
        //====为了在页面显示图片,可以删除====
      }
    }
    xhr.send()
  })
}

获取字典数据列表

export function getDictDataList (dictType) {
  const type = window.SITE_CONFIG['dictList'].find((element) => (element.dictType === dictType))
  if (type) {
    return type.dataList
  } else {
    return []
  }
}

获取字典名称

export function getDictLabel (dictType, dictValue) {
  const type = window.SITE_CONFIG['dictList'].find((element) => (element.dictType === dictType))
  if (type) {
    const val = type.dataList.find((element) => (element.dictValue === dictValue + ''))
    if (val) {
      return val.dictLabel
    } else {
      return dictValue
    }
  } else {
    return dictValue
  }
}

获取uuid

export function getUUID () {
  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {
    return (c === 'x' ? (Math.random() * 16 | 0) : ('r&0x3' | '0x8')).toString(16)
  })
}

树形数据转换

/**
 * 树形数据转换
 * @param {*} data
 * @param {*} id
 * @param {*} pid
 */
export function treeDataTranslate (data, id = 'id', pid = 'pid') {
  var res = []
  var temp = {}
  for (var i = 0; i < data.length; i++) {
    temp[data[i][id]] = data[i]
  }
  for (var k = 0; k < data.length; k++) {
    if (!temp[data[k][pid]] || data[k][id] === data[k][pid]) {
      res.push(data[k])
      continue
    }
    if (!temp[data[k][pid]]['children']) {
      temp[data[k][pid]]['children'] = []
    }
    temp[data[k][pid]]['children'].push(data[k])
    data[k]['_level'] = (temp[data[k][pid]]._level || 0) + 1
  }
  return res
}

获取当前光标位置

export function getPositionforNode(ctrl){
  let caretPos = {
    start: 0,
    end: 0
  }
  if(ctrl.selectionStart) caretPos.start = ctrl.selectionStart
  if(ctrl.selectionEnd) caretPos.end = ctrl.selectionEnd
  return caretPos
}

节流

 /** 
  * @param fun  执行函数
  * @param wait 间隔时间
 */
  export function throttle(func, wait) {
    let previous = 0
    let context, args, time, remaining
    return function() {
      let now = +new Date()
      context = this
      args = arguments
      remaining = wait - (now - previous)// 剩余的还需要等待的时间
      if (remaining <= 0) {
        func.apply(context, args)
        previous = now // 重置“上一次执行”的时间
      } else {
        if (time) {
          clearTimeout(time)
        }
        time = setTimeout(() => {
          func.apply(context, args)
          time = null
          previous = +new Date() // 重置“上一次执行”的时间
        }, remaining) //等待还需等待的时间
      }
    }
  }

递归节点

handleFindCurNode(tree,key,keyField, node = null) {
      const stack = []
      for (const item of tree) {
        if (item) {
          stack.push(item)
          while(stack.length) {
            const temp = stack.shift()
            if (temp.nodeValue !== null && (temp.nodeValue.includes(key))) {
              // console.log(temp)
              node = temp
              break
            }
            const childNodes = temp.childNodes || []
            for (let i = 0; i < childNodes.length; i++) {
              stack.push(childNodes[i])
            }
          }
        }
      }
        return node
    },

下载方法

  // 避免发生乱码要要进行转码
  function saveTXT(content, fileName){
     var blob = new Blob(['\ufeff' + content], {type: 'text/txt,charset=UTF-8'});
     openDownloadDialog(blob, fileName);
    }


const openDownloadDialog = (url, fileName) => {
  if (typeof url === 'object' && url instanceof Blob) {
    url = URL.createObjectURL(url); // 创建blob地址
  }
  const aLink = document.createElement('a');
  aLink.href = url;
  aLink.download = fileName;
  aLink.click();
};
export default {
  /**
   * 保存CSV文件
   * @params content csv文件内容
   * @params fileName 保存的文件名
   */
   
 /** TODO: excel在 office下还是会乱码, wps显示正常 后期可通过插件js-xlsx(https://github.com/SheetJS/sheetjs) 处理**/
 
  saveCSV: (content, fileName) => {
    const blob = new Blob(['\ufeff' + content], {type: 'text/csv,charset=UTF-8'});
    openDownloadDialog(blob, `${fileName}.csv`);
  },
  saveTXT: (content, fileName) => {
    // const href = 'data:text/txt;charset=utf-8,\ufeff' + encodeURIComponent(content); // ie浏览器不支持
    const blob = new Blob(['\ufeff' + content], {type: 'text/tet,charset=UTF-8'});
    openDownloadDialog(blob, `${fileName}.txt`);
  }
}

获取用户IP地址

    // 引入生产版js或者开发版js
<script src="https://cdn.jsdelivr.net/gh/joeymalvinni/webrtc-ip/dist/production.min.js"></script>
<!---- OR use the dev bundle: ----->
<script src="https://cdn.jsdelivr.net/gh/joeymalvinni/webrtc-ip/dist/bundle.dev.js"></script>




<script>
// Using Promises:
getIPs().then(data=>{
  console.log(data.join('\n'))
})

// Using Async/Await:
(async function(){
  let data = await getIPs();
  console.log(data.join('\n'));
})();

</script>

Javascript中的对象从两个数组中获取相同的值?

const res = test.filter(t1 => test2.some(t2 => t1.firstName == t2.firstName && t1.lastName == t2.lastName )); console.log(res);