一些有趣的 js 功能函数

2023-11-04

一些有趣的 js 功能函数

数组

生成数组

当你需要要生成一个0-99的数组

  • 方案1
const createArr = (n) => Array.from(new Array(n), (v, i) => i)
const arr = createArr(100) // 0 - 99 数组
  • 方案2
const createArr = (n) => new Array(n).fill(0).map((v, i) => i)
createArr(100) // 0 - 99数组

打乱数组

当你有一个数组,你需要打乱这个数组的排序

const randomSort = list => list.sort(() => Math.random() - 0.5)
randomSort([0,1,2,3,4,5,6,7,8,9]) // 随机排列结果

数组简单数据去重

当你需要将数组中的所有重复的元素只保留一个

const removeDuplicates = list => [...new Set(list)]
removeDuplicates([0, 0, 2, 4, 5]) // [0,2,4,5]

数组唯一值数据去重

根据唯一值对数组进行去重

const duplicateById = list => [...list.reduce((prev, cur) => prev.set(cur.id, cur), new Map()).values()]
duplicateById([{id: 1, name: 'jack'}, {id: 2, name: 'rose'}, {id: 1, name: 'jack'}])
// [{id: 1, name: 'jack'}, {id: 2, name: 'rose'}]

多数组取交集

当你需要取多个数组中的交集

const intersection = (a, ...arr) => [...new Set(a)].filter((v) => arr.every((b) => b.includes(v)))

intersection([1, 2, 3, 4], [2, 3, 4, 7, 8], [1, 3, 4, 9])
// [3, 4]

查找最大值索引

但你需要找到一个数组中的最大值的索引

const indexOfMax = (arr) => arr.reduce((prev, curr, i, a) => (curr > a[prev] ? i : prev), 0);
indexOfMax([1, 3, 9, 7, 5]); // 2

查找最小值索引

当你需要找到一个数组中的最小值的索引

const indexOfMin = (arr) => arr.reduce((prev, curr, i, a) => (curr < a[prev] ? i : prev), 0)
indexOfMin([2, 5, 3, 4, 1, 0, 9]) // 5

找到最接近的数值

当你需要在一个数组中找到一个最接近的值

const closest = (arr, n) => arr.reduce((prev, curr) => (Math.abs(curr - n) < Math.abs(prev - n) ? curr : prev))
closest([29, 87, 8, 78, 97, 20, 75, 33, 24, 17], 50) // 33

压缩多个数组(拉链函数)

当你需要将多个数组压缩成一个数组

const zip = (...arr) => Array.from({ length: Math.max(...arr.map((a) => a.length)) }, (_, i) => arr.map((a) => a[i]))
zip([1,2,3,4], ['a', 'b', 'c', 'd'], ['A', 'B', 'C', 'D'])
// [[1, 'a', 'A'], [2, 'b', 'B'], [3, 'c', 'C'], [4, 'd', 'D']]

矩阵交换行和列

当你需要将一个矩阵的行和列进行互相交换

const transpose = (matrix) => matrix[0].map((col, i) => matrix.map((row) => row[i]));
transpose(
    [              // [
        [1, 2, 3], //      [1, 4, 7],
        [4, 5, 6], //      [2, 5, 8],
        [7, 8, 9], //      [3, 6, 9],
     ]             //  ]
 ); 

数字转换

进制转换

将 10 进制转换成 n 进制,可以使用 toString(n)

const toDecimal = (num, n = 10) => num.toString(n) 

// 假设数字10要转换成2进制
toDecimal(10, 2) // '1010'

将 n 进制转换成 10 进制,可以使用 parseInt(num, n)

// 10的2进制为1010
const toDecimalism = (num, n = 10) => parseInt(num, n)
toDecimalism(1010, 2)

正则

手机号格式化

当你需要将手机号码格式化成xxx-xxxx-xxxx的形式

const formatPhone = (str, sign = '-') => str.replace(/(\W|\s)/g, "").split(/^(\d{3})(\d{4})(\d{4})$/).filter(item => item).join(sign)

formatPhone('13123456789') // '131-2345-6789'
formatPhone('13 1234 56 789', ' ') // '131 2345 6789'

去除多余空格

当你需要将一段文本中的多个空格合并成一个空格

const setTrimOut = str => str.replace(/\s\s+/g, ' ')
const str = setTrimOut('hello,   jack') // hello, jack

web

重新加载当前页面

const reload = () => location.reload();
reload()

滚动到页面顶部

如果你需要将页面翻到最顶部

const goToTop = () => window.scrollTo(0, 0);
goToTop()

元素滚动

如果你希望将一个元素顺滑的滚动到可视区域的起点

const scrollToTop = (element) => element.scrollIntoView({ behavior: "smooth", block: "start" })
scrollToTop(document.body)

如果你希望将一个元素顺滑的滚动到可视区域的终点

const scrollToBottom = (element) => element.scrollIntoView({ behavior: "smooth", block: "end" })
scrollToBottom(document.body)

检查当前是否IE浏览器

const isIE = !!document.documentMode;

从给定文本中剥离 html

当你需要在某个文本中将里面的标签全部过滤掉

const stripHtml = (html) => new DOMParser().parseFromString(html, 'text/html').body.textContent || '';
stripHtml('<div>test</div>') // 'test'

重定向

当你需要跳转到其他页面

const goTo = (url) => (location.href = url);

文本粘贴

当你需要复制文本到粘贴板上

const copy = (copyText) => {
 return navigator.clipboard?.writeText && navigator.clipboard
    .writeText(copyText)
    .then(() => {
      return Promise.resolve()
    })
    .catch(() => {
      const input = document.createElement('input')
      document.body.appendChild(input)
      input.setAttribute('value', copyText)
      input.select()
      try {
		  const result = document.execCommand('copy')
		  document.body.removeChild(input)
		  if (!result || result === 'unsuccessful') {
		    return Promise.reject('复制失败')
		  } else {
		    return Promise.resolve()
		  }
		} catch (e) {
		  document.body.removeChild(input)
		  return Promise.reject(
		    '当前浏览器不支持复制功能,请检查更新或更换其他浏览器操作'
		  )
		}
    })
}

copy('你需要粘贴的文本')

日期

判断日期是否为今天

const isToday = (date) => date.toISOString().slice(0, 10) === new Date().toISOString().slice(0, 10)

日期转换

当你需要将日期转换为为 YYYY-MM-DD 格式

const formatYmd = (date) => date.toISOString().slice(0, 10);
formatYmd(new Date())

秒数转换

当你需要将秒数转换为 hh:mm:ss 格式

const formatSeconds = (s) => new Date(s * 1000).toISOString().substr(11, 8)
formatSeconds(200) // 00:03:20

获取某年某月的第一天

当你需要获取某年某月的第一天

const getFirstDate = (d = new Date()) => new Date(d.getFullYear(), d.getMonth(), 1);
getFirstDate(new Date('2022-04')) // Fri Apr 01 2022 00:00:00 GMT+0800 (中国标准时间)
getFirstDate(new Date('2022-04-05')).toLocaleDateString() // 2022/4/1

获取某年某月的最后一天

当你需要获取某年某月的最后一天

const getLastDate = (d = new Date()) => new Date(d.getFullYear(), d.getMonth() + 1, 0);
getLastDate(new Date('2023-03-04')) // Fri Mar 31 2023 00:00:00 GMT+0800 (中国标准时间)
getLastDate(new Date('2023-03-04')).toLocaleDateString() // 2023/3/31

获取某年某月份天数

当你需要获取某年某个月份的总天数

const getDaysNum = (year, month) => new Date(year, month, 0).getDate()  
const day = getDaysNum(2024, 2) // 29

函数

异步函数判断

判断一个函数是否属于异步函数

const isAsyncFunction = (v) => Object.prototype.toString.call(v) === '[object AsyncFunction]'
isAsyncFunction(async function () {}); // true

数字

截断数字

当你需要将小数点后的某些数字截断而不取四舍五入

const toFixed = (n, fixed) => `${n}`.match(new RegExp(`^-?\d+(?:.\d{0,${fixed}})?`))[0]
toFixed(10.255, 2) // 10.25

四舍五入

当你需要将小数点后的某些数字截断,并取四舍五入

const round = (n, decimals = 0) => Number(`${Math.round(`${n}e${decimals}`)}e-${decimals}`)
round(10.145, 2) // 10.15

10.145.toFixed(2) // 10.14

// Number.prototype.toPrecision方法以指定的精度返回该数值对象的字符串表示。
10.145.toPrecision(21) // '10.1449999999999995737'

补零

当你需要在一个数字num不足len位数的时候前面补零操作

const replenishZero = (num, len, zero = 0) => num.toString().padStart(len, zero)
replenishZero(8, 2) // 08

对象

删除无效属性

当你需要删除一个对象中的属性值为 null 或 undefined 的所有属性

const removeNullUndefined = (obj) => Object.entries(obj).reduce((a, [k, v]) => (v == null ? a : ((a[k] = v), a)), {});

removeNullUndefined({name: '', age: undefined, sex: null}) // { name: '' }

反转对象键值

当你需要将对象的键值对交换

const invert = (obj) => Object.keys(obj).reduce((res, k) => Object.assign(res, { [obj[k]]: k }), {})
invert({name: 'jack'}) // {jack: 'name'}

字符串转对象

当你需要将一串字符串比如’{name: “jack”}'转换成对象时,直接使用JSON.parse将会报错。

const strParse = (str) => JSON.parse(str.replace(/(\w+)\s*:/g, (_, p1) => `"${p1}":`).replace(/\'/g, "\""))

strParse('{name: "jack"}')

JSON.parse('{name: "jack"}') // 报错
JSON.parse('{"name": "jack"}') // 正常

其他

比较两个对象

当你需要比较两个对象,js的等于只能判断对象的地址是否相同,当地址不相同的时候无法判断两个对象的键值对是否一致。

const isEqual = (...objects) => objects.every(obj => JSON.stringify(obj) === JSON.stringify(objects[0]))
isEqual({name: 'jack'}, {name: 'jack'}) // true
isEqual({name: 'jack'}, {name: 'jack1'}, {name: 'jack'}) // false

随机颜色生成

当你需要获取一个随机颜色

const getRandomColor = () => `#${Math.floor(Math.random() * 0xffffff).toString(16)}`
getRandomColor() // '#4c2fd7'

颜色格式转换

当你需要将16进制的颜色转换成rgb

const hexToRgb = hex => hex.replace(/^#?([a-f\d])([a-f\d])([a-f\d])$/i, (_, r, g, b) => `#${r}${r}${g}${g}${b}${b}`).substring(1).match(/.{2}/g).map((x) => parseInt(x, 16));
hexToRgb('#00ffff'); // [0, 255, 255]
hexToRgb('#0ff'); // [0, 255, 255]

获取随机 ip

当你需要生成一个ip地址

const randomIp = () =>
    Array(4)
        .fill(0)
        .map((_, i) => Math.floor(Math.random() * 255) + (i === 0 ? 1 : 0))
        .join('.');
      
randomIp() // '18.133.38.119'
randomIp() // '96.152.111.16'

当你需要生成一个 id

const uuid = (a) => (a ? (a ^ ((Math.random() * 16) >> (a / 4))).toString(16) : ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, uuid))
uuid()

获取cookie

当你需要将cookie转换成对象

const getCookie = () => document.cookie
    .split(';')
    .map((item) => item.split('='))
    .reduce((acc, [k, v]) => (acc[k.trim().replace('"', '')] = v) && acc, {})
getCookie()

强制等待

当你需要等待一段时间,但又不想写在setTimeout函数中,造成回调地狱

const sleep = async (t) => new Promise((resolve) => setTimeout(resolve, t));
sleep(2000).then(() => {console.log('time')});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一些有趣的 js 功能函数 的相关文章

随机推荐

  • TCP/IP协议栈各层涉及到的协议

    21 tcp FTP 文件传输协议 22 tcp SSH 安全登录 文件传送 SCP 和端口重定向 23 tcp Telnet 远程连接 80 tcp HTTP 443 tcp HTTPS 计算机各层网络协议 五层 应用层 典型设备 应用程
  • jsp页面中文乱码解决方法

    在运行jsp页面时 发现本该出现中文的地方 出现的是乱码 中文乱码出现的原因一般是编码不符 检查一下代码 可以看到
  • PyQt5-多线程的使用

    PyQt中的多线程 它能实现多任务 让界面用一个线程更新 让逻辑代码在另外一个线程中 互不影响 如果不使用多线程的话 在运行一个时间较长的代码时 程序会卡住 使用多线程 import sys import time from PyQt5 i
  • Linux中使用Docker安装ElasticSearch7.10.x集群

    使用Docker安装ElasticSearch7 10 x单节点请访问这里 一 集群环境说明 服务器IP地址 192 168 137 1 192 168 137 2 192 168 137 3 二 前期准备 1 拉取镜像 docker pu
  • linux下percona-toolkit工具包的安装和使用(超详细版)

    一 检查和安装与Perl相关的模块 PT工具是使用Perl语言编写和执行的 所以需要系统中有Perl环境 依赖包检查命令为 rpm qa perl DBI perl DBD MySQL perl Time HiRes perl IO Soc
  • 【Python】只需2行代码,轻松将PDF转换成Word(含示范案例)

    文章目录 一 前期准备 二 pdf2docx功能 三 限制 四 案例 一 前期准备 可将 PDF 转换成 docx 文件的 Python 库 该项目通过 PyMuPDF 库提取 PDF 文件中的数据 然后采用 python docx 库解析
  • 来自对Socket的深度剖析

    Socket是什么 socket 的中文解释为 插座 非常的生动形象 在计算机通信领域 socket 被翻译为 套接字 它是计算机之间进行通信的一种约定或一种方式 通过 socket 一台计算机可以接收其他计算机的数据 也可以向其他计算机发
  • 【技巧】easyUI的datagrid,如何在翻页以后仍能记录被选中的行

    easyUI的datagrid在复选框多选时 如何在翻页以后仍能记录被选中的行 注意datagrid中需要配置idField属性 一般为数据的主键 转载于 https www cnblogs com yx007 p 8081522 html
  • 接口测试面试题含答案

    1 解释一下正向和逆向测试 正向测试 针对接口设计预期的功能和行为 验证接口是否按照预期工作 逆向测试 针对错误输入 不合理的条件或非预期的使用方式 验证接口是否能够适当地处理这些情况并提供合理的错误处理 2 什么是API和Web服务 AP
  • 支持CUDA运算的显卡算力表

    GPUs supported Supported CUDA level of GPU and card CUDA SDK 1 0 support for compute capability 1 0 1 1 Tesla CUDA SDK 1
  • c++17 using继承所有构造函数

    include tmp h include
  • 三维坐标系怎么画?

    在中学时代主要接触的是二维平面坐标需系 但是在学习空间几何图形时 会需要用到三维坐标系 这就需要我们也要掌握其绘制方法 在黑板上画三维坐标系有点困难 所以要借助专业的绘图工具来完成 下面就一起来学习具体绘制技巧 几何画板作为专业的几何绘图软
  • 智能手机普及游戏 国内外巨头上演GPU芯片争霸

    转自 http tech sina com cn t 2014 02 12 16139155996 shtml 新浪科技讯 2月12日下午消息 随着近日国家解除游戏机禁令以及游戏向手机终端转移 国内外移动通信芯片厂商高通 75 62 0 9
  • umi-request设置请求头_scrapy_splash 设置随机请求头

    本文为 霾大 scrapy splash 爬取 js 加载网页初体验 zhuanlan zhihu com 的补充 在上面的文章中我们仅仅是初步完成了 scrapy splash 的简单使用 接下来我们将介绍如何是使得 splash 在 r
  • 时间序列模型(二):AR模型

    全文共8000余字 预计阅读时间约18 30分钟 满满干货 建议收藏 介绍 在时间序列分析中 我们经常遇到一种强大而灵活的模型 即ARIMA模型 这个模型已经在各种领域 如经济学 气候学 股票市场分析等 发挥了巨大的作用 尽管ARIMA模型
  • 掌握react,这一篇就够了

    react众所周知的前端3大主流框架之一 由于出色的性能 完善的周边设施风头一时无两 本文就带大家一起掌握react jsx语法 前端MVVM主流框架都有一套自己的模板处理方法 react则使用它独特的jsx语法 在组件中插入html类似的
  • vue 的指令

    目录 一 vue 的指令 1 v text 2 v html 3 v show 4 v if v esle if v else 1 v if 2 v if 与 v show 5 v for 1 v for 渲染一个数组 2 v for 渲染
  • node-sass安装后,启动本地环境爆出,Error: Node Sass does not yet support your current environment: Windows 64-bit

    最近有个很老的项目各种依赖库都很老 在本地环境中出现 Error Node Sass does not yet support your current environment Windows 64 bit with Unsupported
  • springboot运行出现 错误: 找不到或无法加载主类 com.xxxx.xxxx.Application

    项目打成jar包放在服务器上之后就未在使用 今天打开一运行居然报错 错误 找不到或无法加载主类 com fdway omui OmUiApplication 解决办法 1 项目 右键 Debug As 或 Run As Maven inst
  • 一些有趣的 js 功能函数

    一些有趣的 js 功能函数 数组 生成数组 打乱数组 数组简单数据去重 数组唯一值数据去重 多数组取交集 查找最大值索引 查找最小值索引 找到最接近的数值 压缩多个数组 拉链函数 矩阵交换行和列 数字转换 进制转换 正则 手机号格式化 去除