js常用封装方法

2023-05-16

/*
 * 生成随机数
 * @length 指定长度
 * return 随机数
*/
export function randomNum(length) {
   let ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
   ALPHABET += 'abcdefghijklmnopqrstuvwxyz';
   ALPHABET += '0123456789-_';
   let str = '';
   let i = 0;
   while(i < length){
      let rand = Math.floor(Math.random() * ALPHABET.length);
      str += ALPHABET.substring(rand, rand + 1);
      i++;
   }
   return str;
}

/*
* 浮点数精度丢失
* passive 被加减数
* active 加减数
* Symbol +加-减*乘/除
 	js数字精度丢失通常是出现在浮点数运算上,比如`0.1 + 0.2 != 0.3`
	解决思路:将浮点数乘倍数为整数进行计算完毕后再除倍数
* */
export function accuracyCalculation(passive,active,Symbol = '+'){
   let passiveNumber = String(passive)
   let activeNumber = String(active)
   let passivCount = ''  // 被加减数 小数点几位数
   let activeCount = ''  // 加减数 小数点几位数
   let Multiple = 1      // 倍数
   let MultipleActive = 1
   if(passiveNumber.indexOf('.') !== -1 || activeNumber.indexOf('.') !== -1){
      if(passiveNumber.indexOf('.') !== -1) passivCount = passiveNumber.length - (passiveNumber.indexOf('.')+1)
      if(activeNumber.indexOf('.') !== -1) activeCount = activeNumber.length - (activeNumber.indexOf('.')+1)
      if(Symbol === '+' || Symbol === '-'){
         let count = passivCount > activeCount ? passivCount : activeCount
         for (let i = 0; i < count ; i++) Multiple = Multiple * 10
      }else{
         for (let i = 0; i < passivCount ; i++) Multiple = Multiple * 10
         for (let i = 0; i < activeCount ; i++) MultipleActive = MultipleActive * 10
      }
   }
   let result = ''
   if(Symbol === '+') result = passive * Multiple + active * Multiple
   else if(Symbol === '-') result = passive * Multiple - active * Multiple
   else if(Symbol === '*') result = (passive * Multiple) * (active * MultipleActive)
   else if(Symbol === '/') result = (passive * Multiple) / (active * MultipleActive)

   return  Symbol === '/' ? result : result / Multiple / MultipleActive
}

/*
 * 替换String中所有子串
 * @string 字符串
 * @substr 子串 被替换值
 * @separator 分离器 替换的新增
 */
export function replaceStr(string,substr,separator){
   return string.split(substr).join(separator)
}

/*
* 查询字符串中子串出现的所有相应下标
* @string 字符串
* @substr 子串
* return 相应下标的数组
* */
export function search_substr_pos(string, substr) {
   let _search_pos = string.indexOf(substr), _arr_positions = [];
   while (_search_pos > -1) {
      _arr_positions.push(_search_pos);
      _search_pos = string.indexOf(substr, _search_pos + 1);
   }
   return _arr_positions;
}

/*
* 查找数组中重复值和对应重复下标
* @arr 数组
* return { duplicate_val:重复值 , duplicate_index:对应重复下标 }
* */
export function search_duplicate_val(arr){
   let duplicate_val = [] , duplicate_index = []
   arr.forEach((item,index)=>{
      arr.forEach((items,indexs)=>{
         if(index !== indexs){
            if(item === items){
               if(!duplicate_val.includes(item)) duplicate_val.push(item)
            }
         }
      })
   })
   duplicate_val.forEach(item=>{
      duplicate_index.push(search_substr_pos(arr,item).join('、'))
   })
   return { duplicate_val, duplicate_index }
}

/*
* 查询一组 数组日期是否为连续日
* dateArr 数组日期 ["2022-02-26","2022-02-27","2022-03-01", "2022-03-04","2022-03-05"]
* return 返回 连续日期value  ["2022-02-26,2022-02-27","2022-03-04,2022-03-04"]
* 注意使用sort()所有会打乱dateArr数组日期的顺序,由前到后排序
* */
export function search_duplicate_day(dateArr){
   dateArr = duplicateRemoval(dateArr.sort())  // 去重
   let _days = dateArr.sort().map((day, index) => {
      let date = new Date(day)
      date.setDate(date.getDate() + 4 - index) // 如果为连续日期则处理为相同日期,且转为时间戳
      return +date
   })
   let returnDays = []
   let getDaySequenceData = search_duplicate_val(_days).duplicate_index

   if(getDaySequenceData.length !== 0){
      getDaySequenceData.forEach(item=>{
         let str = []
         item.split('、').forEach(itemIndex=>{
            str.push(dateArr[itemIndex])
         })
         returnDays.push(str.join('、'))
      })
   }
   return returnDays
}

/*
* 数组去重 利用Set所有元素的唯一性
* @arr 数组
* */
export function duplicateRemoval(arr){
   return Array.from(new Set(arr))
}


/* 自定义对象类 */
export class CustomObject{
   constructor(obj) { this.obj = obj; }
   /*
   * 过滤掉value为空的key值
   * obj Object对象
   * */
   filterEmpty(obj = this.obj){
      let result = recursion_fil.call(this,obj)
      return result
   }
   /*
   * 替换key值
   * @this.newKey 新key
   * @this.oldKey 被替换的旧key
   * @obj Object对象
   * */
   replaceKey(obj = this.obj){
      let result = recursion_rep.call(this,obj,this.newKey,this.oldKey)
      return result
   }
}
// 递归 过滤掉value为空的key值
function recursion_fil(obj){
   let newObj = {}
   Object.keys(obj).forEach(item=>{
      if(Number(item) !== 0) {
         // 如果是Object对象
         if(obj[item] instanceof Object && Object.keys(obj[item]).length){
            if(obj[item]){
               newObj[item] = obj[item]
               // 当对象中有key的value为空则删除过滤掉
               Object.keys(newObj[item]).forEach(items=>{
                  if(!newObj[item][items]) delete newObj[item][items]
               })
               this.filterEmpty(obj[item])
            }
         }
         // 如果不是对象,且有value
         if(!(obj[item] instanceof Object)) {
            if(obj[item]) newObj[item] = obj[item]
         }
      }
   })
   return newObj
}
// 递归 替换key
function recursion_rep(obj,newKey,oldKey){
   let newObj = {}
   Object.keys(obj).forEach(item=>{
      if(Number(item) !== 0){
         if(obj[item] instanceof Object && Object.keys(obj[item]).length){
            if(obj[item]) this.replaceKey(obj[item])
         }
         if(item === oldKey) newObj[newKey] = obj[item]
         else newObj[item] = obj[item]
      }
   })
   return newObj
}
/*
* 计算字符串长度,中文为两个字符
* @str 字符串
* return 字符串长度
* */
export function computedStrLen(str) {
   let len = 0 , i= 0;
   while (i < str.length){
      let strData = str.charCodeAt(i);
      if ((strData >= 0x0001 && strData <= 0x007e) || (0xff60 <= strData && strData <= 0xff9f)) len++;
      else len += 2;
      i++;
   }
   return len;
}

export default {
   randomNum,
   accuracyCalculation,
   replaceStr,
   search_substr_pos,
   search_duplicate_val,
   search_duplicate_day,
   duplicateRemoval,
   CustomObject,
   computedStrLen,
}

// Math.pow(m,n)--m的n次方
// Math.pow(x,y)也存在精度丢失问题
let decimal = Math.pow(10, (num.length - (num.indexOf('.')+1)))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

js常用封装方法 的相关文章

  • 酒店管理系统-需求分析报告

    目录 1 引言 1 1编制的目的 1 2术语定义 1 3参考资料 1 4相关文档 2 概述 2 1项目的描述 2 2项目的功能 2 3用户特点 3 具体需求 3 1业务需求 3 1 1主要业务 3 1 2未来增长预测 3 2用户需求 3 3
  • 酒店管理系统-概要设计报告

    目录 1 引言 1 1编制的目的 1 2项目背景 1 3术语定义 1 4参考资料 1 5相关文档 2 总体设计 2 1项目的描述 2 2项目的功能 2 3概念设计和处理流程 2 4系统总体结构设计 2 5系统各功能模块详细说明 2 5 1住
  • 解决 Cannot find module‘[object Object]‘报错问题

    报错信息 xff1a 不可以找到一个module 模块 js中的模块大致与require挂钩 xff0c 可以查看是否有地方错误引用了文件或错误使用了require 修改后即可解决问题
  • Jmeter性能测试(3)---SOAP/XML-RPC Request

    jmeter xff08 三 xff09 SOAP XML RPC Request 项目背景 xff1a 公司的微信端H5界面新开发了会员注册功能 xff0c 需要对其进行压力测试 项目目标 xff1a 需要承受每分钟最少6000的压力 一
  • Pycharm 之Scipy聚类色彩

    一 利用第三方库Scipy聚类 1 可以在jupyter notebook里先尝试一下scipy的功能 聚类的思想为初始先确定均值 xff0c 分类 xff0c 其次计算每组的平均值 xff0c 再次进行分类 xff0c 反复进行使得结果更
  • TM4C123系列(一)————GPIO

    电赛准备搞飞机 xff0c 特地学了下TM4 xff0c 准备用TM4搞飞控 一 实验介绍 点亮TM4C123板载LED 二 原理图 三 所需函数 1 SysCtlClockSet uint32 t ui32Config 参数 xff1a
  • TM4C123系列(三)————PWM输出

    一 实验介绍 使用PWM控制板载LED绿灯与蓝灯交替呼吸闪烁 二 PWM介绍 TM4C123有两个PWM模块 xff0c 每个模块有四个发生器和一个控制模块 xff0c 每个发生器可以产生两路PWM输出 xff0c 一共可以输出16路PWM
  • STM32与K210串口通信的解码问题(基于正点原子源码)

    这次电赛做的声源定位 xff0c 用的麦克风阵列加k210采集声音 xff0c k210需要将数据传送stm32 xff0c 在这里涉及到一个解码问题 xff0c 这个解码是我在之前用stm32与其他设备串口通信中从来没有遇到过的 xff0
  • 【数据结构与算法】数据结构

    数据结构 1 基本概念和术语2 逻辑结构与物理结构3 抽象数据类型 1 基本概念和术语 数据 xff1a 是描述客观事物的符号 xff0c 是计算机中可以操作的对象 xff0c 是能被计算机识别 xff0c 并输入给计算机处理的符号集合 数
  • requests库在爬虫中最常用方法简析

    requests 前言一 安装二 使用方法1 引入库2 发起请求3 获取数据4 其他 三 简单示例总结 前言 requests是基于urlib3的用于发起http请求的python第三方库 xff0c 使用方便 xff0c 响应快速 一 安
  • 爬取英语六级高频词

    文章目录 任务一 指定url二 发起请求并获取响应数据三 对响应数据进行数据解析四 持久化存储总结 任务 将网站中所有英语六级高频词以及翻译获取 xff0c 然后进行存储 一 指定url 网站中单词被分开存放在1 7页中 第1页的url x
  • 基于tkinter的第一个GUI小项目:背英语六级单词软件

    文章目录 任务1 引入库2 读入数据3 打开窗口4 初始化5 放置标签和按钮6 按钮事件7 演示 任务 基于爬取到的英语六级高频词 xff0c 利用python中的tkinter做出一个能起到考察词汇掌握情况作用的GUI 1 引入库 spa
  • Linux 6.1/6.2发布新补丁:缓解AMD处理器fTPM间歇性卡顿问题

    导读早些时候 xff0c AMD承认 xff0c 在Linux系统中开启AMD锐龙处理器的fTPM xff0c 将可能导致系统出现间歇性的卡顿 死机等情况 据悉 xff0c 该Bug在Linux 6 1内核中表现得最为明显 xff0c 这是
  • RHCE. Stratis 管理分层存储

    通过Stratis xff0c 便捷的使用精简配置 xff08 thin provisioning xff09 xff0c 快照 xff08 snapshots xff09 和基于池 xff08 pool based xff09 的管理和监
  • Jmeter性能测试(5)--JDBC Request

    jmeter xff08 五 xff09 JDBC Request jmeter中取样器 xff08 Sampler xff09 是与服务器进行交互的单元 一个取样器通常进行三部分的工作 xff1a 向服务器发送请求 xff0c 记录服务器
  • jQuery获取或设置元素的属性值prop/attr

    获取元素的属性值 固有属性 39 div prop color 自定义属性 39 div attr index html代码 lt a href 61 34 www baidu com 34 title 61 34 百度 34 gt 百度
  • Aop小案例

    AOP小案例 AOP Aspect Oriented Programming 面向切面编程 00P Object Oriented Programming 面向对象编程 xff0c 用对象化的思想来完成程序 AOP是对0OP的一个补充 xf
  • 详细介绍在ubuntu20.04如何安装ROS系统,附常见错误的解决办法

    为保证在安装的过程中配置无误 xff0c 建议先打开软件与更新的界面 xff0c 检查框出的选项是否打上了 检查完成后 xff0c 就可以开始安装啦 xff01 1 添加ROS软件源 将以下两个命令任意选择一个复制到ubuntu的终端执行
  • ROS1学习笔记:创建工作环境与功能包(ubuntu20.04)

    参考B站古月居ROS入门21讲 xff1a 创建工作环境与功能包 基于VMware Ubuntu 20 04 Noetic版本的环境 文章目录 一 工作空间介绍二 创建工作空间2 1 创建工作空间2 2 编译空代码的工作空间2 3 设置和检
  • SQL注入

    常用函数 SQL注入步骤 联合查询注入 函数与报错注入 SQL盲注 宽字节注入 sqlmap工具 常用函数 常用系统函数 基础信息函数功能system user 系统用户名user 用户名current user 当前用户名session

随机推荐

  • 信息收集*

    域名信息收集 DNS记录查询 whois查询 备案信息查询 子域名信息收集 常用工具 查询网站 网络信息收集 c段查询 nmap扫描 获取真实IP 敏感信息收集 目录后台扫描 指纹信息识别 系统指纹识别 中间件指纹识别 Web程序指纹识别
  • 将kali linux 的语言切换为中文

    重置root密码 导入kali后 xff0c 一般没有root密码 xff0c 需要重置root密码的 使用sudo passwd root 命令重置密码 换源 因为默认源下载东西特别慢 xff0c 所以我们需要换源 输入vim etc a
  • curl命令

    在Linux中curl是一个利用URL规则在命令行下工作的文件传输工具 xff0c 可以说是一款很强大的http命令行工具 它支持文件的上传和下载 xff0c 是综合传输工具 xff0c 但按传统 xff0c 习惯称url为下载工具 htt
  • Docker基本命令

    一 安装docker 1 docker运行时需要到管理员用户权限 现在我们是普通用户 xff0c 终端内输入命令 su root切换为root用户 使用apt get update 更新软件源中的所有软件列表 2 使用apt install
  • Nmap常用命令

    nmap hostname ip 或者多个 ip 或者子网 192 168 123 iL ip txt 扫描 ip txt 的所有 ip A 包含了 sV xff0c O xff0c 探测操作系统信息和路由跟踪 一般不用 xff0c 是激烈
  • Jmeter性能测试(6)--元件的作用域与执行顺序

    jmeter xff08 六 xff09 元件的作用域与执行顺序 jmeter是一个开源的性能测试工具 xff0c 它可以通过鼠标拖拽来随意改变元件之间的顺序以及元件的父子关系 xff0c 那么随着它们的顺序和所在的域不同 xff0c 它们
  • sql,逻辑漏洞,xss,反序列化思维导图

  • Arduino MAX30102脉搏心率传感器使用教程

    最近闲来无事 xff0c 得到了一块MAX30102 xff0c 手头刚好有多余的Arduino控制板 xff0c 就跑了个官方的案例 xff0c 发现测出来的脉搏和心率还是挺准的 xff0c 三星手机用过这个系列的芯片 xff0c 但是有
  • 两种方法用IDEA创建一个Servlet程序 新手教程详解

    1 Servlet 是什么 xff1f Java Servlet 是运行在 Web 服务器或应用服务器上的程序 xff0c 它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层 2
  • reduce()累计器理解与使用实例

    关于reduce reduce 语法 xff1a arr reduce callback accumulator currentValue index array initialValue arr reduce accumulator cu
  • {}与Object.create(null)

    var one 61 创建的对象带有 proto 下面有一些方法与属性 xff0c 这便是js的原型链继承 xff0c 继承了object的方法和属性 xff1b 故在遍历对象时 xff0c 会遍历原型链上的属性 xff0c 带来性能上的损
  • uni-app 全局变量机制

    getApp globalData 全局变量机制 在App vue中 export default globalData text 39 text 39 在App vue中调用 this globalData text在onLaunch生命
  • vue3动态注册路由

    在vue cil2中 xff0c 我们可以通过webpack中require context这个api实现工程自动化 xff0c 而在vue cil3里vite替代了webpack xff0c 节省了webpack冗长的打包时间的同时我们也
  • try{}catch(res){}、throw(exception)、new Error()

    1 try catch res try 中的代码出现错误异常时 xff0c 系统会将异常信息封装到error对象中 xff0c 传递给catch res xff0c 包含res message res name等 EvalError eva
  • new Map()

    1 new Map let data 61 new Map data set key value 添加一个新建元素到映射 Map 1 key 61 gt value data get key 返回映射中的指定元素 data has key
  • Proxy代理

    Proxy用于修改某些操作的默认行为 xff0c 等同于在语言层面做出修改 xff0c 所以属于一种 元编程 语法 xff1a let proxy 61 new Proxy target handler target 所要拦截的目标对象ha
  • Jmeter性能测试(7)--定时器

    jmeter xff08 七 xff09 定时器 jmeter提供了很多元件 xff0c 帮助我们更好的完成各种场景的性能测试 xff0c 其中 xff0c 定时器 xff08 timer xff09 是很重要的一个元件 xff0c 最新的
  • oninput完美限制输入正整数

    oninput完美限制输入非0正整数 注意vue中需要 64 input进行绑定 方法一 64 input 61 34 if this value length 61 61 1 this value 61 this value replac
  • 行内存放数据属性data-id

    data 61 39 data 39 为行内存放数据的属性 xff0c 可通过事件源中的currentTarget dataset获取data 存放的值 另外css可通过 data 放置的标签名 data 61 39 data 39 设置
  • js常用封装方法

    span class token comment 生成随机数 64 length 指定长度 return 随机数 span span class token keyword export span function span class t