269个JavaScript工具函数,助你提升工作效率(6)

Stella981
• 阅读 651

269个JavaScript工具函数,助你提升工作效率(6)

151.数组中某元素出现的次数

/** * @param { array } arr * @param {*} value */
    export function countOccurrences(arr, value) {
   
    return arr.reduce((a, v) => v === value ? a + 1 : a + 0, 0);
    }

152.加法函数(精度丢失问题)

/** * @param { number } arg1 * @param { number } arg2 */
       export function add(arg1, arg2) {
   
       let r1, r2, m;
   try {
    r1 = arg1.toString().split(".")[1].length } catch (e) {
    r1 = 0 }
    try {
    r2 = arg2.toString().split(".")[1].length } catch (e) {
    r2 = 0 }
    m = Math.pow(10, Math.max(r1, r2));
    return (arg1 * m + arg2 * m) / m
    }

153.减法函数(精度丢失问题)

/** * @param { number } arg1 * @param { number } arg2 */
       export function sub(arg1, arg2) {
   
       let r1, r2, m, n;
       try {
    r1 = arg1.toString().split(".")[1].length } catch (e) {
    r1 = 0 }
   try {
    r2 = arg2.toString().split(".")[1].length } catch (e) {
    r2 = 0 }
    m = Math.pow(10, Math.max(r1, r2));
    n = (r1 >= r2) ? r1 : r2;
    return Number(((arg1 * m - arg2 * m) / m).toFixed(n));
    }

154.除法函数(精度丢失问题)

/** * @param { number } num1 * @param { number } num2 */
       export function division(num1,num2){
   
       let t1,t2,r1,r2;
       try{
   
           t1 = num1.toString().split('.')[1].length;
       }catch(e){
   
           t1 = 0;
       }
       try{
   
           t2=num2.toString().split(".")[1].length;
       }catch(e){
   
           t2=0;
   }
    r1=Number(num1.toString().replace(".",""));
    r2=Number(num2.toString().replace(".",""));
    return (r1/r2)*Math.pow(10,t2-t1);
    }

155.乘法函数(精度丢失问题)

/** * @param { number } num1 * @param { number } num2 */
       export function mcl(num1,num2){
   
   let m=0,s1=num1.toString(),s2=num2.toString();
    try{
   m+=s1.split(".")[1].length}catch(e){
   }
    try{
   m+=s2.split(".")[1].length}catch(e){
   }
    return Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m);
    }

156.递归优化(尾递归)

/** * @param { function } f */
       export function tco(f) {
   
   let value;
       let active = false;
       let accumulated = [];
    
       return function accumulator() {
   
           accumulated.push(arguments);
           if (!active) {
   
               active = true;
               while (accumulated.length) {
   
                   value = f.apply(this, accumulated.shift());
               }
               active = false;
           return value;
        }
    };
    }

157.生成随机整数

export function randomNumInteger(min, max) {
   
    switch (arguments.length) {
   
        case 1:
            return parseInt(Math.random() * min + 1, 10);
        case 2:
            return parseInt(Math.random() * (max - min + 1) + min, 10);
        default:
            return 0
    }
}

158.去除空格

/** * @param { string } str 待处理字符串 * @param { number } type 去除空格类型 1-所有空格 2-前后空格 3-前空格 4-后空格 默认为1 */
       export function trim(str, type = 1) {
   
       if (type && type !== 1 && type !== 2 && type !== 3 && type !== 4) return;
       switch (type) {
   
           case 1:
               return str.replace(/\s/g, "");
           case 2:
               return str.replace(/(^\s)|(\s*$)/g, "");
           case 3:
               return str.replace(/(^\s)/g, "");
           case 4:
           return str.replace(/(\s$)/g, "");
        default:
            return str;
    }
    }

159.大小写转换

/** * @param { string } str 待转换的字符串 * @param { number } type 1-全大写 2-全小写 3-首字母大写 其他-不转换 */

export function turnCase(str, type) {
   
    switch (type) {
   
        case 1:
            return str.toUpperCase();
        case 2:
            return str.toLowerCase();
        case 3:
            return str[0].toUpperCase() + str.substr(1).toLowerCase();
        default:
            return str;
    }
}

160.随机16进制颜色 hexColor

/** * 方法一 */
       export function hexColor() {
   
    
       let str = '#';
       let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'A', 'B', 'C', 'D', 'E', 'F'];
       for (let i = 0; i < 6; i++) {
   
           let index = Number.parseInt((Math.random() * 16).toString());
       str += arr[index]
    }
    return str;
    }

161.随机16进制颜色 randomHexColorCode

/** * 方法二 */
   export const randomHexColorCode = () => {
   
    let n = (Math.random() * 0xfffff * 1000000).toString(16);
    return '#' + n.slice(0, 6);
    };

162.转义html(防XSS攻击)

export const escapeHTML = str =>{
   
    str.replace(
        /[&<>'"]/g,
        tag =>
            ({
   
                '&': '&amp;',
                '<': '&lt;',
                '>': '&gt;',
                "'": '&#39;',
                '"': '&quot;'
            }[tag] || tag)
    );
};

163.检测移动/PC设备

export const detectDeviceType = () => {
    return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ? 'Mobile' : 'Desktop'; };

164.隐藏所有指定标签

/** * 例: hide(document.querySelectorAll('img')) */
    export const hideTag = (...el) => [...el].forEach(e => (e.style.display = 'none'));

165.返回指定元素的生效样式

/** * @param { element} el 元素节点 * @param { string } ruleName 指定元素的名称 */
    export const getStyle = (el, ruleName) => getComputedStyle(el)[ruleName];

166.检查是否包含子元素

/** * @param { element } parent * @param { element } child * 例:elementContains(document.querySelector('head'), document.querySelector('title')); // true */
    export const elementContains = (parent, child) => parent !== child && parent.contains(child);

167.数字超过规定大小加上加号“+”,如数字超过99显示99+

/** * @param { number } val 输入的数字 * @param { number } maxNum 数字规定界限 */
       export const outOfNum = (val, maxNum) =>{
   
       val = val ? val-0 :0;
       if (val > maxNum ) {
   
       return `${ maxNum}+`
    }else{
   
        return val;
    }
    };

168.如何隐藏所有指定的元素

const hide = (el) => Array.from(el).forEach(e => (e.style.display = 'none'));

 // 事例:隐藏页面上所有`<img>`元素?
 hide(document.querySelectorAll('img'))

169.如何检查元素是否具有指定的类?

页面DOM里的每个节点上都有一个classList对象,程序员可以使用里面的方法新增、删除、修改节点上的CSS类。使用classList,程序员还可以用它来判断某个节点是否被赋予了某个CSS类。

const hasClass = (el, className) => el.classList.contains(className)

 // 事例
 hasClass(document.querySelector('p.special'), 'special') // true

170.如何切换一个元素的类?

const toggleClass = (el, className) => el.classList.toggle(className)

 // 事例 移除 p 具有类`special`的 special 类
 toggleClass(document.querySelector('p.special'), 'special')

171.如何获取当前页面的滚动位置?

const getScrollPosition = (el = window) => ({
   
   x: el.pageXOffset !== undefined ? el.pageXOffset : el.scrollLeft,
   y: el.pageYOffset !== undefined ? el.pageYOffset : el.scrollTop
 });

 // 事例
 getScrollPosition(); // {x: 0, y: 200}

172.如何平滑滚动到页面顶部

const scrollToTop = () => {
   
   const c = document.documentElement.scrollTop || document.body.scrollTop;
   if (c > 0) {
   
     window.requestAnimationFrame(scrollToTop);
     window.scrollTo(0, c - c / 8);
   }
 }

 // 事例
 scrollToTop()

window.requestAnimationFrame() 告诉浏览器——你希望执行一个动画,并且要求浏览器在下次重绘之前调用指定的回调函数更新动画。该方法需要传入一个回调函数作为参数,该回调函数会在浏览器下一次重绘之前执行。
 requestAnimationFrame:优势:由系统决定回调函数的执行时机。60Hz的刷新频率,那么每次刷新的间隔中会执行一次回调函数,不会引起丢帧,不会卡顿。

window.requestAnimationFrame() 告诉浏览器——你希望执行一个动画,并且要求浏览器在下次重绘之前调用指定的回调函数更新动画。该方法需要传入一个回调函数作为参数,该回调函数会在浏览器下一次重绘之前执行。
 requestAnimationFrame:优势:由系统决定回调函数的执行时机。60Hz的刷新频率,那么每次刷新的间隔中会执行一次回调函数,不会引起丢帧,不会卡顿。

173.如何检查父元素是否包含子元素?

const elementContains = (parent, child) => parent !== child && parent.contains(child);

 // 事例
 elementContains(document.querySelector('head'), document.querySelector('title')); 
 // true
 elementContains(document.querySelector('body'), document.querySelector('body')); 
 // false

174.如何检查指定的元素在视口中是否可见?

const elementIsVisibleInViewport = (el, partiallyVisible = false) => {
   
   const {
    top, left, bottom, right } = el.getBoundingClientRect();
   const {
    innerHeight, innerWidth } = window;
   return partiallyVisible
     ? ((top > 0 && top < innerHeight) || (bottom > 0 && bottom < innerHeight)) &&
         ((left > 0 && left < innerWidth) || (right > 0 && right < innerWidth))
     : top >= 0 && left >= 0 && bottom <= innerHeight && right <= innerWidth;
 };

 // 事例
 elementIsVisibleInViewport(el); // 需要左右可见
 elementIsVisibleInViewport(el, true); // 需要全屏(上下左右)可以见

175.如何获取元素中的所有图像?

const getImages = (el, includeDuplicates = false) => {
   
   const images = [...el.getElementsByTagName('img')].map(img => img.getAttribute('src'));
   return includeDuplicates ? images : [...new Set(images)];
 };

 // 事例:includeDuplicates 为 true 表示需要排除重复元素
 getImages(document, true); // ['image1.jpg', 'image2.png', 'image1.png', '...']
 getImages(document, false); // ['image1.jpg', 'image2.png', '...']

176.如何确定设备是移动设备还是台式机/笔记本电脑?

const detectDeviceType = () =>
   /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)
     ? 'Mobile'
     : 'Desktop';

 // 事例
 detectDeviceType(); // "Mobile" or "Desktop"

177.How to get the current URL?

const currentURL = () => window.location.href

 // 事例
 currentURL() // 'https://google.com'

178.如何创建一个包含当前URL参数的对象?

const getURLParameters = url =>
   (url.match(/([^?=&]+)(=([^&]*))/g) || []).reduce(
     (a, v) => ((a[v.slice(0, v.indexOf('='))] = v.slice(v.indexOf('=') + 1)), a),
     {
   }
   );

 // 事例
 getURLParameters('http://url.com/page?n=Adam&s=Smith'); // {n: 'Adam', s: 'Smith'}
 getURLParameters('google.com'); // {}

179.如何将一组表单元素转化为对象?

const formToObject = form =>
   Array.from(new FormData(form)).reduce(
     (acc, [key, value]) => ({
   
       ...acc,

[key]: value

​     }),
​     {
   }
   );

 // 事例
 formToObject(document.querySelector('#form')); 
 // { email: 'test@email.com', name: 'Test Name' }

180.如何从对象检索给定选择器指示的一组属性?

const get = (from, ...selectors) =>
   [...selectors].map(s =>
     s
       .replace(/\[([^\[\]]*)\]/g, '.$1.')
       .split('.')
       .filter(t => t !== '')
       .reduce((prev, cur) => prev && prev[cur], from)
   );
 const obj = {
    selector: {
    to: {
    val: 'val to select' } }, target: [1, 2, {
    a: 'test' }] };

 // Example
 get(obj, 'selector.to.val', 'target[0]', 'target[2].a'); 
 // ['val to select', 1, 'test']
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Stella981 Stella981
3年前
Nginx反向代理upstream模块介绍
!(https://oscimg.oschina.net/oscnet/1e67c46e359a4d6c8f36b590a372961f.gif)!(https://oscimg.oschina.net/oscnet/819eda5e7de54c23b54b04cfc00d3206.jpg)1.Nginx反
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这