前端常用函数封装

常用函数封装

获取某日期若干个工作日后的日期

* 参数:
*   time: [String] 给定日期 yyyy-MM-dd
*   itervalByDay: [Number] 相隔工作日
*   separator: [String] 年月日分隔符
* 返回:
*   rq:[String] 匹配的日期yyyy-MM-dd
var getworkday = function(time, itervalByDay, separator = '-'){
  var str = time.split("-");

  var date = getDate();
  date.setUTCFullYear(str[0], str[1] - 1, str[2]);
  date.setUTCHours(0, 0, 0, 0);

  var millisceonds =date.getTime();
  for(var i = 1; i

解析URL参数

* 参数:
*   url: [String] 解析的URL,可选,不传该值默认本地href
* 返回:
*   obj:[Object] 参数集合对象
function getQueryParam(url) {
    const href = url || window.location.href;
    let args = href.split('?');

    // 没有参数直接返回{}
    if (args[0] === href) {
        return {};
    }

    var hrefarr = args[1].split('#')[0].split('&');
    var obj = {};
    for (var i = 0; i < hrefarr.length; i++) {
        hrefarr[i] = hrefarr[i].split('=');
        obj[hrefarr[i][0]] = hrefarr[i][1];
    }
    return obj;
}

格式化日期

* &#x53C2;&#x6570;:
*   date: &#x65F6;&#x95F4;&#x6233; [Date]
*   isTime: &#x662F;&#x5426;&#x8FD4;&#x56DE;&#x5177;&#x4F53;&#x65F6;&#x95F4; [Boolean]
*   separator: &#x5E74;&#x6708;&#x65E5;&#x5206;&#x9694;&#x7B26; [String]
* &#x8FD4;&#x56DE;&#xFF1A;
*   isTime: false => yyyy-MM-dd [String]
*   isTime: true => yyyy-MM-dd HH:mm:ss [String]
const formatDate = (date, isTime = false, separator = '-') => {
  const year = date.getFullYear()
  const month = date.getMonth() + 1
  const day = date.getDate()
  let d = [year, month, day].map(_formatNumber).join(separator)
  if (isTime) {
    const hour = date.getHours()
    const minute = date.getMinutes()
    const second = date.getSeconds()
    const time = [hour, minute, second].map(_formatNumber).join(':')

    d = ${d} ${time}
  }
  return d
}
const _formatNumber = n => {
  n = n.toString()
  return n[1] ? n : '0' + n
}

// padStart()补齐日期位数
formatDate() {
  const date = new Date()
  const year = date.getFullYear().toString().padStart(4, '0')
  const month = (date.getMonth() + 1).toString().padStart(2, '0')
  const day = date.getDate().toString().padStart(2, '0')
  const result = ${year}-${month}-${day}
  return result
}

解析身份证号码信息

* &#x53C2;&#x6570;:
*   IdCard: [String] &#x8EAB;&#x4EFD;&#x8BC1;&#x53F7;&#x7801;
*   type: [Number] 1/2/3
* &#x8FD4;&#x56DE;&#xFF1A;
*   type&#xFF1A;1 => birthday [String] &#x51FA;&#x751F;&#x65E5;&#x671F;
*   type&#xFF1A;2 => sex [Number] &#x6027;&#x522B;
*   type&#xFF1A;3 => age [Number] &#x5E74;&#x9F84;
formatIdCard (IdCard, type) {
  if (type === 1) {
    // 获取出生日期
    var birthday = IdCard.substring(6, 10) + '-' + IdCard.substring(10, 12) '-' + IdCard.substring(12, 14)
    return birthday
  }
  if (type === 2) {
    // 获取性别
    if (parseInt(IdCard.substr(16, 1)) % 2 === 1) {
      return '1' // 男
    } else {
      return '2' // 女
    }
  }
  if (type === 3) {
    // 获取年龄
    var ageDate = new Date()
    var month = ageDate.getMonth() + 1
    var day = ageDate.getDate()
    var age = ageDate.getFullYear() - IdCard.substring(6, 10) - 1
    if (IdCard.substring(10, 12) < month || IdCard.substring(10, 12) === mont&& IdCard.substring(12, 14)

微信小程序wx.request封装

* 1.&#x8F93;&#x51FA;&#x5B8C;&#x6574;&#x63A5;&#x53E3;&#x65E5;&#x5FD7;
* 2.&#x7EDF;&#x4E00;&#x914D;&#x7F6E;&#x8BF7;&#x6C42;&#x5934;&#x3001;&#x54CD;&#x5E94;&#x53C2;&#x6570;
* 3.&#x7EDF;&#x4E00;&#x7BA1;&#x7406;&#x8BF7;&#x6C42;&#x54CD;&#x5E94;&#x64CD;&#x4F5C;&#xFF08;&#x6210;&#x529F;&#x3001;&#x5931;&#x8D25;&#xFF09;
request ({
  url,
  header,
  data = {},
  code = 'errCode', // 接口返回的业务标识
  method = 'POST',
  dataType = 'json',
  timeout = 10000,
  success = () => {},
  fail = () => {},
  complete = () => {}
}) {
  wx.showLoading({ title: '正在加载中', mask: true })
  return wx.request({
    url,
    data,
    method,
    header: {
      'content-type': 'application/json',
      token: this.globalData.token,
      ...header,
    },
    timeout,
    complete: res => {
      wx.hideLoading()
      // 打印信息
      console.log('');
      console.group(---- ${url} ----)
      console.log('Params', data)
      console.log('Header', {
        'content-type': 'application/json',
        token: this.globalData.token,
        ...header,
      })
      console.log('Response', res)
      console.info(#### ${url} ####)
      console.groupEnd()
      complete(res)
      // 返回成功
      if (res.data && +res.data[code] === 1) {
        return success(res.data)
      }
      // 返回错误
      fail(res.data)
    }
  })
}

获取图片base64

* &#x53C2;&#x6570;:
*   file {file object} &#x6587;&#x4EF6;&#x5BF9;&#x8C61;
* &#x8FD4;&#x56DE;:
*   {Promise}
async function imgToBase64 (file) {
  return new Promise((resolve,reject) => {
    const reader = new FileReader()
    reader.readAsDataURL(file)
    reader.onload = e => {
      resolve(e.target.result)
    }
    reader.onerror = err => {
        reject(err)
    }
  })
}

图片压缩

* &#x539F;&#x7406;: &#x628A;&#x56FE;&#x7247;&#x5BBD;&#x5EA6;&#x3001;&#x9AD8;&#x5EA6;&#x8C03;&#x5C0F;
* @param file {file object | file base64}
* @param {width, height}&#xFF1A;&#x538B;&#x7F29;&#x56FE;&#x7247;&#x5BBD;&#x9AD8;
* @returns {Promise}
*
* Tip&#xFF1A; &#x4E0E;imgToBase64()&#x914D;&#x5408;&#x4F7F;&#x7528;&#x6548;&#x679C;&#x66F4;&#x4F73;
async function imgToCompressed (file, {
  width,
  height
}) {
  if (typeof file === 'object') {
    file = await imgToBase64(file)
  }

  return new Promise(resolve => {
    var image = new Image()
    image.src = file

    image.onload = () => {
      const _width = image.width
      const _height = image.height
      const canvas = document.createElement('canvas')
      const context = canvas.getContext('2d')
      let data = ''
      if (width && width > _width) {
        width = _width
        height = _height
      } else {
        // 等比例缩放
        width = width || Math.floor(_width * height / _height)
        height = height || Math.floor(width * _height / _width)
      }

      canvas.width = width
      canvas.height = height

      context.drawImage(image, 0, 0, width, height)
      data = canvas.toDataURL('image/jpeg').replace('data:image/jpeg;base64,', '')

      resolve(data)
    }
  })
}

前端搜索+分页

// 模糊搜索
function searchList() {
  const search = this.search
  const pageIndex = this.pageIndex
  const pageSize = this.pageSize

  if (search) {
    // filter() 方法创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素。
    // 注意: filter() 不会对空数组进行检测。
    // 注意: filter() 不会改变原始数组。
    return this.list.filter(data => {
      // some() 方法用于检测数组中的元素是否满足指定条件;
      // some() 方法会依次执行数组的每个元素:
      // 如果有一个元素满足条件,则表达式返回true , 剩余的元素不会再执行检测;
      // 如果没有满足条件的元素,则返回false。
      // 注意: some() 不会对空数组进行检测。
      // 注意: some() 不会改变原始数组。
      return Object.keys(data).some(key => {
        // indexOf() 返回某个指定的字符在某个字符串中首次出现的位置,如果没有找到就返回-1;
        // 该方法对大小写敏感!所以之前需要toLowerCase()方法将所有查询到内容变为小写。
        return (String(data[key]).toLowerCase().indexOf(search) > -1).slice((pageIndex - 1) * pageSize, pageIndex * pageSize)
      })
    })
  }
  return this.list
}

判断数据类型方法

* &#x5224;&#x65AD;&#x6570;&#x636E;&#x7C7B;&#x578B;&#x65B9;&#x6CD5;
* @param {any} data &#x5F85;&#x5224;&#x65AD;&#x7C7B;&#x578B;&#x7684;&#x6570;&#x636E;
* @returns {string}
const _typeof = function (data) {
    const value = /\[object (\w+)\]/.exec(
        Object.prototype.toString.call(data)
    );
    return value ? value[1].toLowerCase() : '';
}

// 简化版-判断效果一致
const _typeof = function (data) {
    return Object.prototype.toString.call(data).slice(8, -1)
}

// Test
_typeof('123')      //"string"
_typeof(123)        //"number"
_typeof(123n)       //"bigint"
_typeof(null)       //"null"
_typeof(undefined)  //"undefined"
_typeof({})         //"object"
_typeof([])         //"array"
_typeof(/123/)      //"regexp"

base64解码

* base64&#x89E3;&#x7801;
* &#x4F18;&#x5316;&#x4E2D;&#x6587;&#x4E71;&#x7801;&#x95EE;&#x9898;
* @param {String} b64Str &#x5F85;&#x89E3;&#x7801;&#x7684;base64&#x6570;&#x636E;
* @returns {string}
function b64ToUtf8(b64Str) {
  return decodeURIComponent(window.atob(b64Str).split('').map(c => '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2)).join(''))
}

// atob()解码不支持中文
// base64编码前先对中文URL转码
window.btoa(encodeURIComponent(str))

冒泡排序

* &#x5192;&#x6CE1;&#x6392;&#x5E8F;
* &#x6BD4;&#x8F83;&#x76F8;&#x90BB;&#x7684;&#x5143;&#x7D20;&#x3002;&#x5982;&#x679C;&#x7B2C;&#x4E00;&#x4E2A;&#x6BD4;&#x7B2C;&#x4E8C;&#x4E2A;&#x5927;&#xFF0C;&#x5C31;&#x4EA4;&#x6362;&#x4ED6;&#x4EEC;&#x4E24;&#x4E2A;&#xFF0C;&#x5BF9;&#x6BCF;&#x4E00;&#x5BF9;&#x76F8;&#x90BB;&#x5143;&#x7D20;&#x4F5C;&#x540C;&#x6837;&#x7684;&#x5DE5;&#x4F5C;&#xFF0C;&#x4ECE;&#x5F00;&#x59CB;&#x7B2C;&#x4E00;&#x5BF9;&#x5230;&#x7ED3;&#x5C3E;&#x7684;&#x6700;&#x540E;&#x4E00;&#x5BF9;&#x3002;&#x5728;&#x8FD9;&#x4E00;&#x70B9;&#xFF0C;&#x6700;&#x540E;&#x7684;&#x5143;&#x7D20;&#x5E94;&#x8BE5;&#x4F1A;&#x662F;&#x6700;&#x5927;&#x7684;&#x6570;&#x3002;
* @param {Array} arr &#x5F85;&#x6392;&#x5E8F;&#x7684;&#x6570;&#x7EC4;
* @returns {Array}
function bubbleSort(arr) {
  const len = arr.length
  for (var i = 0; i < n; i++) {
    // 每次冒泡完毕,右侧新固定一个较大值
    for (var j = 1; j < n - i; j++) {
      // 比较,交换大的于右侧
      if (arr[j - 1] > arr[j]) {
        [arr[j - 1], arr[j]] = [arr[j], arr[j - 1]]
      }
    }
  }
  return arr
}

bubbleSort([5, 2, 4, 6, 1, 3]) // 输出[1, 2, 3, 4, 5, 6]

// 常见优化方法
// 1.添加交换记录标志
// 用于标志某一趟排序过程中是否有数据交换,如果进行某一趟排序时并没有进行数据交换,则说明数据已经按要求排列好,可立即结束排序,避免不必要的比较过程。

前端常用函数封装

插入排序

* &#x63D2;&#x5165;&#x6392;&#x5E8F;
* &#x63D2;&#x5165;&#x6392;&#x5E8F;&#x7684;&#x5DE5;&#x4F5C;&#x65B9;&#x5F0F;&#x50CF;&#x8BB8;&#x591A;&#x4EBA;&#x6392;&#x5E8F;&#x4E00;&#x624B;&#x6251;&#x514B;&#x724C;&#xFF0C;&#x62FF;&#x4E00;&#x5F20;&#x724C;&#x4F9D;&#x6B21;&#x5BF9;&#x6BD4;&#x624B;&#x4E0A;&#x7684;&#x724C;&#x7EC4;&#x7136;&#x540E;&#x63D2;&#x5165;&#x5230;&#x724C;&#x7EC4;&#x5408;&#x9002;&#x4F4D;&#x7F6E;&#xFF0C;&#x91CD;&#x590D;&#x76F4;&#x81F3;&#x6700;&#x540E;&#x4E00;&#x5F20;&#x3002;
* @param {Array} arr &#x5F85;&#x6392;&#x5E8F;&#x7684;&#x6570;&#x7EC4;
* @returns {Array}
function insertionSort(arr) {
  // 手上牌组
  let newArr = [arr[0]]
  let len = arr.length

  // 从左边开始,每次拿一个与已排列好的数组进行比较
  for (let i = 1; i < len; i++) {
    for (let j = 0; j < i; j++) {
      // 若拿的牌小于手上某张牌,则插入该牌前方
      if (arr[i]

顺序/逆序 排序

* &#x987A;&#x5E8F;/&#x9006;&#x5E8F; &#x6392;&#x5E8F;
* @param {Array} arr &#x5F85;&#x6392;&#x5E8F;&#x7684;&#x6570;&#x7EC4;
* @returns {Array}
function _sort(arr) {
    return arr.sort((a,b) => {
        return a - b
        // return b - a 逆序
    })
}

_sort([1, 4, 2]) // 输出[1, 2, 4]

选择排序

* &#x9009;&#x62E9;&#x6392;&#x5E8F;
* &#x9996;&#x5148;&#x5728;&#x672A;&#x6392;&#x5E8F;&#x5E8F;&#x5217;&#x4E2D;&#x627E;&#x5230;&#x6700;&#x5C0F;&#xFF08;&#x5927;&#xFF09;&#x5143;&#x7D20;&#xFF0C;&#x5B58;&#x653E;&#x5230;&#x6392;&#x5E8F;&#x5E8F;&#x5217;&#x7684;&#x8D77;&#x59CB;&#x4F4D;&#x7F6E;&#x3002;&#x518D;&#x4ECE;&#x5269;&#x4F59;&#x672A;&#x6392;&#x5E8F;&#x5143;&#x7D20;&#x4E2D;&#x7EE7;&#x7EED;&#x5BFB;&#x627E;&#x6700;&#x5C0F;&#xFF08;&#x5927;&#xFF09;&#x5143;&#x7D20;&#xFF0C;&#x7136;&#x540E;&#x653E;&#x5230;&#x5DF2;&#x6392;&#x5E8F;&#x5E8F;&#x5217;&#x7684;&#x672B;&#x5C3E;&#x3002;
* @param {Array} arr &#x5F85;&#x6392;&#x5E8F;&#x7684;&#x6570;&#x7EC4;
* @returns {Array}
function selectionSort(arr) {
    var len = arr.length;
    var minIndex, temp;
    for (var i = 0; i < len - 1; i++) {
        minIndex = i;
        for (var j = i + 1; j < len; j++) {
            if (arr[j] < arr[minIndex]) {  // 寻找最小的数
                minIndex = j; // 将最小数的索引保存
            }
        }
        // 索引没改变则表明当前项位置正确,无需变换位置
        if(minIndex === i) continue
        [arr[i], arr[minIndex]] = [arr[minIndex], arr[i]]
    }
    return arr
}

selectionSort([5, 2, 4, 6, 1, 3]) // 输出[1, 2, 3, 4, 5, 6]

前端常用函数封装

Original: https://www.cnblogs.com/zh1q1/p/16224477.html
Author: 吴知木
Title: 前端常用函数封装

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/599515/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Java中的锁——锁的分类

    Java中有各种各样的锁,例如公平锁、乐观锁等等,这篇文章主要介绍一下各种锁的分类。 *公平锁/非公平锁 公平锁是指多个线程按照申请锁的顺序来获取锁。 非公平锁是指多个线程获取锁的…

    数据库 2023年6月9日
    078
  • Dockerfile 构建镜像

    从 Dockerfile 构建镜像涉及三个步骤 创建工作目录 编写 Dockerfile 规格 使用 docker build 命令构建镜像 1. 创建工作目录 这个根据应用实际情…

    数据库 2023年6月14日
    066
  • JavaWeb核心篇(2)——Request和Response

    JavaWeb核心篇(2)——Request和Response 上篇文章中提及到了Servlet,在Servlet中我们主要继承了HTTPServlet类,在HTTPServlet…

    数据库 2023年6月14日
    0107
  • 设计模式之工厂方法

    一、工厂方法:简单工厂违背了单一职责原则,而且不利于扩展,于是衍生了工厂方法模式,该模式能很好地解决对扩展开放、对修改关闭的需求。 二、实现思路 :对每一个对象都创建一个对应的工厂…

    数据库 2023年6月14日
    0116
  • Oracle 备份与恢复 (Docker部署版)

    Oracle 备份与恢复 (Docker部署版) 一,宿主机设置定时备份脚本 1.检查Oracle容器是否正常运行 docker ps 2.进入容器,创建shell脚本 #orac…

    数据库 2023年6月11日
    0100
  • IDEA 快捷键

    普通快捷键 分类 说明 快捷键 代码提示 代码提示或自动补全 Alt + / 代码提示 Ctrl + Alt + Space 提示方法参数类型 Ctrl + P 提示注释文档 Ct…

    数据库 2023年6月6日
    082
  • django中的模板层简介

    1.什么是模板层 模板层可以根据视图中传递的字典数据动态生产相应的HTML页面 2.模板层的配置 1.&#x5728;&#x9879;&#x76EE;&am…

    数据库 2023年6月14日
    078
  • Ajax请求下载文件的解决方案

    写这个博客之前我并不清楚 ajax请求是下载不了文件的 😅 这段时间在写一个自己的项目,用到了ajax下载文件,请求到了controller层并返回文件下载成功 但是浏览器就是没有…

    数据库 2023年6月9日
    0247
  • Linux 系统安装RocketMQ

    准备工作 1.去官网下载一个安装包 1.解压 unzip rocketmq-all-4.9.0-bin-release.zip -d /download/compress/ 2.进…

    数据库 2023年6月6日
    088
  • MYSQL的Java操作器——JDBC

    在学习了Mysql之后,我们就要把Mysql和我们之前所学习的Java所结合起来 而JDBC就是这样一种工具:帮助我们使用Java语言来操作Mysql数据库 JDBC简介 首先我们…

    数据库 2023年6月14日
    081
  • tomcat加载启动过程

    流程图 posted @2022-08-19 17:43 默念x 阅读(9 ) 评论() 编辑 Original: https://www.cnblogs.com/monianxd…

    数据库 2023年6月16日
    089
  • 如何把返回的datatable按某个字段 排序 升序或者降序

    如何把返回的datatable按某个字段 排序 升序或者降序 DataTable dtdata = GetXmlData(doc, “DetailList”…

    数据库 2023年6月9日
    069
  • FIO磁盘性能测试工具

    FIO磁盘性能测试工具 简介 一般我们测试硬盘或者存储的性能的时候,会用Linux系统自带的dd命令,因为是自带命令,简单易使用,因此一些客户喜欢使用dd命令来测试磁盘的读写性能。…

    数据库 2023年6月9日
    084
  • 从学校到公司,2022新的起点!!!

    步入新的阶段 目前仍然是大学生的身份,但也算是打工人了。2021秋招时来到了天津的一个公司做实习生,并签订了三方协议。已经来公司将近一个月了,我在这段时间想了很多关于我的未来发展方…

    数据库 2023年6月6日
    073
  • spring的自动注入

    Spring自动注入 spring的ioc 在刚开始学习spring的时候肯定都知道spring的两个特点:ioc,aop,控制反转和切面编程,这篇就只说说ioc ioc是什么:在…

    数据库 2023年6月16日
    089
  • 十一章 配置文件参数化

    把Spring配置文件中需要经常修改的字符串信息,转移到一个更小的配置文件中 1. 小配置文件(.properties) 2. 好处 : 利于维护 1.配置文件参数化开发步骤 已数…

    数据库 2023年6月14日
    081
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球