前端:分享JS中7个高频的工具函数
目录
◆1、将数字转换为货币
◆2、将 HTML 字符串转换为 DOM 对象
◆3、防抖
◆4、日期验证
◆5、将 FormData(表单数据)转换为 JSON
◆6、衡量一个函数的性能
◆7、从数组中删除重复项

JavaScript 实用函数是有用的、可重复使用的片段,您可以在许多不同的项目中重复使用。它们的目的是为常见任务提供一致且高效的输出,并帮助提高代码的一致性。因此在我们的日常开发中,经常整理和维护一套适合自己的函数工具库还是很有必要的。
在本文中,我想重点介绍我在许多项目中使用的 7 个实用函数,并解释它们的用途。
◆1、将数字转换为货币
在 JavaScript 中处理货币时,事情会变得复杂。特别是当您需要处理显示不同类型的货币时。
JavaScript 提供了 Intl.NumberFormat 对象,它允许您以本地化语言的方式格式化数字。它提供的选项之一是将数字格式化为货币。
此函数接受 3 个参数:
-
num — 要格式化的数字。
-
currency — 要格式化为的货币 — 默认设置为“CNY”,因为我们的业务主要需要处理基于人民币的价格。
-
locale — 默认设置为“zh-CN'”,因为我们的业务是人民币的信息。
如下代码所示:
const value = convertToCurrency('1799.99');
const holder = document.getElementById('holder');
holder.innerText = value;function convertToCurrency(num, currency = 'CNY', locale = 'zh-CN') {
const formatter = new Intl.NumberFormat(locale, {
style: 'currency',
currency: currency
});return formatter.format(num);
}
如果运行上述代码,界面将会输出以逗号分隔,并带有人民币的货币数字,如下所示:
¥1,799.99
◆2、将 HTML 字符串转换为 DOM 对象
在许多情况下,您可能会收到 HTML 字符串而不是 HTML 元素。例如,当从 API 接收 JSON 响应中的 HTML 时,或者当通过像 Nunjucks 这样的模板解析器呈现模板时。
您可以通过 innerHTML 属性将此 HTML 字符串直接注入到 dom 中,但有时您希望将此字符串转换为 HTML 对象以进行额外的转换、进行验证或更具体的 DOM 注入。
此函数接受 2 个参数:
-
content — 要转换为对象的 HTML 字符串。
-
选择器——您想要接收的内容的选择器——DOMParser 对象将创建一个完整的 HTML Object。如果您只想要某个元素,您可以传入选择器,例如“section”,您将收到该元素。
function parseStringAsHtml(
content,
selector
) {
const domParser = new DOMParser();
const parsed = domParser.parseFromString(content, 'text/html');return parsed.querySelector(selector);
}
JS调用这段函数示例:
const htmlString = `
<article>
<header><h1>Article Heading</h1></header><div>
<p>Article main content</p>
</div><footer><small>Article footer</small></footer>
</article>
`;
const html = parseStringAsHtml(htmlString, 'article');const holder = document.getElementById('holder');
holder.appendChild(html);
◆3、防抖
在 JavaScript 中,防抖函数将确保您的函数仅在每次用户输入时触发一次,或者至少在 wait 参数指定的时间段内触发一次。
例如,假设我们想根据搜索查询向用户显示建议,我们可以在用户键入时显示建议,并在键入每个字母后刷新,但这对用户来说可能很烦人。例如,在输入一个键后至少等待 300 毫秒以显示建议以确保用户完成输入是很常见的。
这个函数有 3 个参数:
-
fn — 要执行的函数。
-
wait — 函数执行前等待的时间。
-
immediate — 一个布尔值,指示是否应立即调用函数的第一次调用。
function debounce(fn, wait, immediate) {
let timeout;
return function setDebounce(...args) {
const later = () => {
timeout = null;
if (!immediate) {
fn.apply(this, args);
}
};const callNow = immediate && !timeout;
clearTimeout(timeout);
timeout = setTimeout(later, wait || 200);if (callNow) {
fn.apply(this, args);
}
};
}
◆4、日期验证
有时您从代码、用户输入或 API 中的某处收到日期字符串,将其转换为日期对象并尝试编辑或显示日期并收到日期无效的错误。
使用这个简单的实用方法,您可以验证新构造的日期对象是否实际上是一个有效的日期对象。
function isDateValid(date) {
return !Number.isNaN(date.getTime());
}
调用示例:
const date1 = new Date('2022-09-05');
const date2 = new Date('not valid date string');console.log(getDayOfWeek(date1)); // Outputs: Monday
console.log(getDayOfWeek(date2)); // Outputs: Errorfunction getDayOfWeek(date) {
if (isDateValid(date) === false) {
throw new Error('Invalid date submitted');
}return date.toLocaleString(
'default', {weekday: 'long'}
);
}function isDateValid(date) {
return !Number.isNaN(date.getTime());
}
◆5、将 FormData(表单数据)转换为 JSON
创建 FormData 对象时,有时将其转换为类似 JSON 的对象,这个需求在我们的业务中很常见。例如,当您将数据发布到的 API 只接受 JSON 请求时。
在大多数情况下,一个 FormData 对象可以很容易地映射到一个对象,但是在处理多选复选框时,事情会变得混乱。由于每个复选框都具有相同的名称,因此对象的键值对将相互覆盖。
这个简单的实用方法为您将 FormData 转换为一个对象,并确保将多选值映射到一个数组,而不是每次都覆盖该值。
function convertFormdataToJsonObject(formData) {
const data = {};for (const [key, value] of formData.entries()) {
if (Object.prototype.hasOwnProperty.call(data, key)) {
const oldValue = data[key];
if (!Array.isArray(data[key])) {
data[key] = [];
data[key].push(oldValue);
}data[key].push(value);continue;
}data[key] = value;
}return data;
}
调用示例:
HTML部分
<form action="post">
<div class="row">
<label for="name">Name</label>
<input type="text" id="name" name="name" placeholder="John Doe">
</div><div class="row">
<label for="email">E-mail Address</label>
<input type="email" id="email" name="email" placeholder="johndoe@gmail.com">
</div><div class="row">
<label for="phone">Phone Number</label>
<input type="tel" id="phone" name="phone" placeholder="+316-12345678">
</div><div class="row">
<label for="interests1">Interests</label>
<div class="checkbox">
<input type="checkbox" name="interests" id="interests1" value="Programming">
<label for="interests1">Programming</label>
</div><div class="checkbox">
<input type="checkbox" name="interests" id="interests2" value="Golf">
<label for="interests2">Golf</label>
</div><div class="checkbox">
<input type="checkbox" name="interests" id="interests3" value="Traveling">
<label for="interests3">Traveling</label>
</div><div class="checkbox">
<input type="checkbox" name="interests" id="interests4" value="Reading">
<label for="interests4">Reading</label>
</div><div class="checkbox">
<input type="checkbox" name="interests" id="interests5" value="Writing">
<label for="interests5">Writing</label>
</div>
</div><div class="row">
<button type="submit">Submit</button>
</div>
</form>
JS调用部分
const form = document.querySelector('form');
form.addEventListener('submit', (event) => {
event.preventDefault();
const formData = new FormData(form);
const json = convertFormdataToJsonObject(formData);
console.log(json);
});
◆6、衡量一个函数的性能
有时您想知道您的应用程序的哪一部分正在减慢您的站点,并且调试函数执行,计算它们所花费的时间很有用。
幸运的是,浏览器提本身就原生支持。但是,不如针对特别的函数,您可以简单地调用这个实用方法,灵活性会高些。
此函数需要 2 个或更多参数:
-
name — 标签的名称显示在控制台中。
-
fn — 您要衡量其性能的函数。
-
任何额外的参数——你正在调用的函数的参数。
function measurePerformance(name, fn, ...args) {
if (typeof fn !== "function") {
console.error(`Provide a valid function, ${typeof fn} provided`)
return;
}
console.time(name)
fn.bind(this, ...args);
console.timeEnd(name)
}
调用示例
measurePerformance('Multiply method', multiply, 7, 10);function multiply(a, b) {
return a * b;
}
◆7、从数组中删除重复项
我经常发现自己需要从数组中删除可能的重复项。将数组转换为 Set 并返回后,此方法返回一个新数组。
集合是一个简单的对象,它存储只能出现一次的值,使其成为删除数组重复数据的简单方法。
function removeDuplicates(array) {
if (!Array.isArray(array)) {
console.error(`array expected, ${typeof array} provided`)
return
}return [...new Set(array)]
}
相关文章:
前端:分享JS中7个高频的工具函数
目录 ◆1、将数字转换为货币 ◆2、将 HTML 字符串转换为 DOM 对象 ◆3、防抖 ◆4、日期验证 ◆5、将 FormData(表单数据)转换为 JSON ◆6、衡量一个函数的性能 ◆7、从数组中删除重复项 JavaScript 实用函数是有用的、可重复使用的片段࿰…...
docker基础用法及镜像和容器的常用命令大全
1.docker 体系架构 Docker 采用了 C / S 架构,包括客户端和服务端。Docker 守护进程作为服务端接受来自客户端的请求,并处理这些请求(创建、运行、分发容器)。客户端和服务端既可以运行在一个机器上,也可通过 socket 或…...
Spring(Bean生命周期)
目录 1. 生命周期简图2. 扩展接口介绍 2.1 Aware接口2.2 BeanPostProcessor接口2.3 InitializingBean2.4 DisposableBean2.5 BeanFactoryPostProcessor接口3. spring的简化配置 3.1 项目搭建3.2 Bean的配置和值注入3.3 AOP的示例 1. 生命周期简图 2. 扩展接口介绍 2.1 Aware接…...
什么是分布式锁?几种分布式锁分别是怎么实现的?
一、什么是分布式锁: 1、什么是分布式锁: 分布式锁,即分布式系统中的锁。在单体应用中我们通过锁解决的是控制共享资源访问的问题,而分布式锁,就是解决了分布式系统中控制共享资源访问的问题。与单体应用不同的是&am…...
【一天一门编程语言】R 语言程序设计极简教程
R 语言程序设计极简教程 文章目录 R 语言程序设计极简教程R语言简介1.1 介绍1.2 R 语言的基础知识1.2.1 语法1.2.2 数据类型1.2.3 基本操作1.3 R 语言的高级知识1.3.1 函数1.3.2 包1.3.3 面向对象编程1.4 使用 R 语言的实践1.4.1 数据处理1.4.2 数据可视化1.4.3 数据建模1.4.3.…...
记一次顿悟的经历
2023.02.20 一次顿悟的经历 体验一次顿悟 需求: 为避免接收数据时一直阻塞,先调用 select 在一定时间内判断是否有数据可读 如果超时,就报错没读到数据,即使返回 如果仍然在 set 里,就调用 recv 函数接收数据 问…...
19_FreeRTOS软件定时器
目录 软件定时器介绍 FreeRTOS软件定时器特点 软件定时器的命令队列 软件定时器的相关配置 单次定时器和周期定时器 软件定时器结构体成员 FreeRTOS软件定时器相关API函数 实验源码 软件定时器介绍 定时器描述:从指定的时刻开始,经过一个指定时间,然后触发一个超时事件…...
值得推荐!安利5款良心又好用的小众软件
电脑上的各类软件有很多,除了那些常见的大众化软件,还有很多不为人知的小众软件,专注于实用功能,简洁干净、功能强悍。今天分享5个实用的软件,简单实用,效果拉满,堪称工作生活必备! …...
Enhanced ShockBurst (ESB)原文翻译
自我学习为主,同时也为所需要的提供一份资料 官方地址 增强型ShockBurst(ESB)是一种支持双向数据包通信的基本协议,包括数据包缓冲、数据包确认和丢失数据包的自动重传。ESB以低功耗提供无线通信,并且实现的代码量小且…...
软件测试之兼容性测试
对于基于计算机平台的软件,在测试过程中必须考虑软、硬件的兼容性,在设计测试用例的过程中必须考虑数据转换或转移的问题,应该尽力发现其可能带来的错误。不仅是基于计算机平台的软件,对于嵌入式软件也一样,在软件升级…...
笔记(一)——容器
容器分类:序列式容器:每个元素都有固定位置,取决于插入的时机和地点,和元素无关,如vector、deque、list、stack、queue。关联式容器:元素位置取决于特定的排序准则,和插入顺序无关,如…...
C++入门:命名空间
假设这样一种情况,当一个班上有两个名叫 Zara 的学生时,为了明确区分它们,我们在使用名字之外,不得不使用一些额外的信息,比如他们的家庭住址,或者他们父母的名字等等。同样的情况也出现在 C 应用程序中。例…...
操作系统(复试准备)
操作系统(复试准备) 第一章知识点 操作系统概述 操作系统的概念 负责协调软硬件等计算机资源的工作 为上层用户,应用程序提供简单易用的接口 是一种系统软件 操作系统的功能与目标 资源的管理者 处理机管理,存储器管理&#x…...
2023年CDGA考试模拟题库(501-600)
2023年CDGA考试模拟题库(501-600) 501.希望从数据中获取价值的组织认识到,高质量数据比低质量数据更有价值。使用劣质数据充满风险,会损害组织的声誉,导致罚款、收入损失、客户流失和负面的媒体曝光等组织基于各种业务驱动因素而着手进行数据质量管理活动,下列哪项不属于上述驱…...
NCNN+Int8+yolov5部署和量化
【GiantPandaCV引言】 还记得我在两个月前写的文章吗,关于yolov4-tiny+ncnn+int8量化的详细教程:NCNN+INT8+YOLOV4量化模型和实时推理 后来准备写yolov5+ncnn+int8量化的教程,却在yolov5的量化上遇到了麻烦,一方面是量化后速度更慢了,另一方面是精度下降严重,出现满屏都…...
springboot+vue.js协同过滤算法之智能旅游推荐系统java
目 录 第一章 绪论 3 1.1课题背景 3 1.2课题研究的目的和意义 3 1.3 研究现状 4 1.4论文所做的主要工作 4 第二章 技术介绍 5 2.1B/S结构 5 2.2MySQL 介绍 5 2.3MySQL环境配置 6 第三章 系统分析与设计 8 3.1系统说明 8 3.2系统可行性分析…...
Google Brain新提出的优化器“Lion”,效果要比Adam(W)更好
Google Brain新提出的优化器“Lion”,效果要比Adam(W)更好 论文地址:https://arxiv.org/abs/2302.06675代码地址:https://github.com/google/automl/blob/master/lion/lion_pytorch.py 1 简单、内存高效、运行速度更快 与 AdamW 和各种自适…...
慢雾:Discord 私信钓鱼手法分析
事件背景 5 月 16 日凌晨,当我在寻找家人的时候,从项目官网的邀请链接加入了官方的 Discord 服务器。在我加入服务器后立刻就有一个"机器人"(Captcha.bot)发来私信要我进行人机验证。这一切看起来相当的合理。我也点击了这个验证链接进行查看…...
2023-2-25 刷题情况
交换字符使得字符串相同 题目描述 有两个长度相同的字符串 s1 和 s2,且它们其中 只含有 字符 “x” 和 “y”,你需要通过「交换字符」的方式使这两个字符串相同。 每次「交换字符」的时候,你都可以在两个字符串中各选一个字符进行交换。 …...
【数据结构】双向链表的接口实现(附图解和源码)
双向链表的接口实现(附图解和源码) 文章目录双向链表的接口实现(附图解和源码)前言一、定义结构体二、接口实现(附图解源码)1.初始化双向链表2.开辟新空间3.尾插数据4.尾删数据5.打印双向链表中数据6.头插数…...
springboot+vue基于web的演唱会音乐会购票管理系统设计系统
目录同行可拿货,招校园代理 ,本人源头供货商系统功能模块分析技术架构设计核心业务流程安全防护措施项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作同行可拿货,招校园代理 ,本人源头供货商 系统功能模块分析 用户模块 注册登…...
intv_ai_mk11效果对比:同一Prompt下intv_ai_mk11与Qwen2.5在代码生成任务表现
intv_ai_mk11效果对比:同一Prompt下intv_ai_mk11与Qwen2.5在代码生成任务表现 1. 测试背景与目的 在当今AI技术快速发展的背景下,代码生成已成为大语言模型的重要应用场景之一。本次测试旨在对比intv_ai_mk11与Qwen2.5两款模型在相同Prompt下的代码生成…...
避坑指南:微信支付V3 SDK自动更新证书失败的5种常见原因及修复方法
微信支付V3证书自动更新失败排查手册:从原理到实战修复 微信支付的V3版本SDK以其自动证书更新机制著称,但不少开发者在集成过程中都遭遇过AutoUpdateCertificatesVerifier的失败问题。证书更新失败不仅会导致支付功能中断,还可能引发验签错误…...
3分钟掌握的网盘密码解析黑科技:让提取码自动获取效率提升10倍
3分钟掌握的网盘密码解析黑科技:让提取码自动获取效率提升10倍 【免费下载链接】baidupankey 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经因为寻找百度网盘分享链接的提取码而浪费大量时间?传统方式下,用户…...
Qwen3.5-2B轻量化技术解析:模型剪枝+KV Cache优化如何降低70%显存占用
Qwen3.5-2B轻量化技术解析:模型剪枝KV Cache优化如何降低70%显存占用 1. 轻量化模型的核心价值 在AI模型部署领域,大模型的资源消耗一直是阻碍其广泛应用的瓶颈。Qwen3.5-2B作为一款仅20亿参数的多模态基础模型,通过创新的轻量化技术实现了…...
Web3D开发入门:5大引擎(Direct3D、OpenGL、UE、Unity、Three.js)选型指南
Web3D开发入门:5大引擎选型实战指南 当虚拟展厅、数字孪生和元宇宙应用席卷各行业时,选择合适的三维引擎成为开发者面临的首个关键决策。本文将带您深入剖析Direct3D、OpenGL、Unreal Engine、Unity和Three.js五大主流方案的技术特性与商业价值ÿ…...
为什么小数据集上神经网络会突然‘开窍‘?揭秘Grokking现象背后的LU机制
为什么小数据集上神经网络会突然"开窍"?揭秘Grokking现象背后的LU机制 在机器学习实践中,我们常常观察到一种反直觉的现象:当神经网络在小规模算法数据集上训练时,测试准确率会在长时间停滞于随机猜测水平后突然跃升至接…...
万象视界灵坛效果展示:血条式置信度进度条与‘同步率’动态分布图实录
万象视界灵坛效果展示:血条式置信度进度条与同步率动态分布图实录 1. 平台概览 万象视界灵坛(Omni-Vision Sanctuary)是一款基于OpenAI CLIP技术的高级多模态智能感知平台。不同于传统视觉识别工具的单调界面,它将复杂的"语…...
求人不如求己!小初高电子教材全套自取,鸡娃路上不迷路!
家有神兽的家长们,是不是经常遇到这种情况:孩子把课本忘在学校,作业没法写;想提前预习下学期的内容,却不知道去哪里找教材;或者想给孩子找点课外拓展资料,又怕买错版本……别急!我花…...
开源工具SMUDebugTool:系统优化与性能调优的终极解决方案
开源工具SMUDebugTool:系统优化与性能调优的终极解决方案 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https:/…...
