前端:分享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.头插数…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
