前端:分享JS中7个高频的工具函数

news2024/11/19 13:42:17

目录

◆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: Error

function 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)]
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/371316.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32开发(14)----CubeMX配置ADC

CubeMX配置ADC前言一、什么是ADC&#xff1f;二、实验过程1.单通道ADC采集STM32CubeMX配置代码实现2.多通道ADC采样(非DMA)STM32CubeMX配置代码实现3.多通道ADC采样&#xff08;DMA&#xff09;STM32CubeMX配置代码实现总结前言 本章介绍使用STM32CubeMX对ADC进行配置的方法&a…

SpringCloud之Seata(二)

4.Seata如何应用于项目&#xff1f; 安装seata及修改配置 4.1 官网下载Seata安装包 4.2 修改seata/config.txt 4.2.1 修改存储方式 store.db.dbTypemysql store.db.driverClassNamecom.mysql.jdbc.Driver store.db.urljdbc:mysql://你的IP:3306/seata?useUnicodetrue sto…

第一篇博客------自我介绍篇

目录&#x1f506;自我介绍&#x1f506;学习目标&#x1f506;如何学习单片机Part 1 基础理论知识学习Part 2 单片机实践Part 3 单片机硬件设计&#x1f506;希望进入的公司&#x1f506;结束语&#x1f506;自我介绍 Hello!!!我是一名即已经步入大二的计算机小白。 --------…

F4—LVDS接口LCD显示彩图测试-2023-02-25

1.简介 系列文章TFT彩条测试介绍到&#xff0c;屏幕是由厂家提供的TFT显示模组和屏幕PCB背板组成。PCB的作用是提供LCD背光所需的电压、用于屏幕显示的电压、与其他设备相连的排针或者其他连接器形式。当模组支持触摸功能时还可以接上触摸转换或触摸控制芯片&#xff0c;通过SP…

Qt 中的XML

XML的基本介绍&#xff1a; 在前端开发中&#xff1a;HTML是用来显示数据&#xff0c;而XML是用来传输和存储数据的 XML 指可扩展标记语言&#xff08;EXtensible Markup Language&#xff09;XML 是一种标记语言&#xff0c;很类似 HTMLXML 的设计宗旨是传输数据&#xff0c;而…

超简单的待办事项列表管理器todo

什么是 todo ? todo 是一个自托管的 todo web 应用程序&#xff0c;可让您以简单且最少的方式跟踪您的 todo。&#x1f4dd; 老苏觉得和之前介绍的 KissLists 比较像 文章传送门&#xff1a;最简单的共享列表服务器KissLists 官方提供了 Demo 演示站点&#xff1a;https://tod…

零基础的人如何入门 Python ?看完这篇文章你就懂了

第一部分&#xff1a;编程环境准备 零基础入门Python的话我不建议用IDE&#xff0c;IDE叫集成开发环境&#xff0c;这东西一般是专业程序员用来实战开发用的&#xff0c;好处很多&#xff0c;比如&#xff1a;调试、语法高亮、项目管理、代码跳转、智能提示、自动完成、单元测…

Android-MVVM之快速上手ViewModel

Android-MVVM之快速上手ViewModel什么是ViewModel&#xff1f;ViewModel生命周期&#xff1f;ViewModel的使用&#xff1f;什么是ViewModel&#xff1f; 简单来说&#xff0c;就是让view层(视图层)与model层(数据层)分离开来的桥梁。让view层展示ui&#xff0c;不持有数据。 Vi…

【2021春节】解题领红包之番外篇

【2021春节】解题领红包之番外篇前言原始代码解题思路flag1寻找flag2的寻找前言 记录下jsfuck的另类&#xff0c;时间都过去两年了&#xff0c;确实有点久远。。。 原始代码 要求找出flag1和flag2值 ([][])[([][[]][])[!![]](!![][][(![][])[[]](![][])[!![]!![]](![][])[!![…

Vue基础入门讲义(二)-语法基础

文章目录1.vue入门案例1.1.HTML模板1.2.vue渲染1.3.双向绑定1.4.事件处理2.Vue实例2.1.创建Vue实例2.2.模板或元素2.3.数据2.4.方法3.生命周期钩子3.1.生命周期3.2.钩子函数3.3.this1.vue入门案例 1.1.HTML模板 在项目目录新建一个HTML文件 01-demo.html 1.2.vue渲染 01-d…

SSM框架-AOP概述、Spring事务

16 spring整合mybatis 16.1 前情代码 实体类 public class Account {private Integer id;private String name;private Double money;public Integer getId() {return id;}public void setId(Integer id) {this.id id;}public String getName() {return name;}public void …

搭建k8s高可用集群—20230225

文章目录多master&#xff08;高可用&#xff09;介绍高可用集群使用技术介绍搭建高可用k8s集群步骤1. 准备环境-系统初始化2. 在所有master节点上部署keepalived3.1 安装相关包3.2 配置master节点3.3 部署haproxy错误解决3. 所有节点安装Docker/kubeadm/kubelet4. 部署Kuberne…

对redis之键值型数据库的理解

键值数据库&#xff0c;首先就要考虑里面可以存什么样的数据&#xff0c;对数据可以做什么样的操作&#xff0c;也就是数据模型和操作接口。它们看似简单&#xff0c;实际上却是我们理解 Redis 经常被用于缓存、秒杀、分布式锁等场景的重要基础。理解了数据模型&#xff0c;你就…

2022年网络安全竞赛——数字取证调查attack.pcapng

攻击日志分析:需求环境可私信博主获取 任务环境说明: 服务器场景:PYsystem0031服务器场景操作系统:未知服务器场景FTP用户名:anonymous 密码:空从靶机服务器的FTP上下载attack.pcapng数据包文件,通过分析数据包attack.pcapng,找出黑客的IP地址,并将黑客的IP地址作为FL…

SPI协议介绍

SPI协议介绍 文章目录SPI协议介绍一、 SPI硬件知识1.1 硬件连线1.2 SPI控制器内部结构二、 SPI协议2.1 传输示例2.2 SPI模式致谢一、 SPI硬件知识 1.1 硬件连线 引脚含义如下&#xff1a; 引脚含义DO(MOSI)Master Output, Slave Input&#xff0c;SPI主控用来发出数据&#x…

逆向之Windows PE结构

写在前面 对于Windows PE文件结构&#xff0c;个人认为还是非常有必要掌握和了解的&#xff0c;不管是在做逆向分析、免杀、病毒分析&#xff0c;脱壳加壳都是有着非常重要的技能。但是PE文件的学习又是一个非常枯燥过程&#xff0c;希望本文可以帮你有一个了解。 PE文件结构…

buu [NCTF2019]babyRSA 1

题目描述&#xff1a; 题目分析&#xff1a; 首先明确两个公式&#xff1a; e*d 1 mod (p-1)(q-1) ed1 e*d - 1 k(p-1)(q-1)想要解出此题&#xff0c;我们必须知道n,而要知道n,我们要知道p和q的值通过 e*d 的计算&#xff0c;我们知道其长度为2066位&#xff0c;而生成p的…

《分布式技术原理与算法解析》学习笔记Day22

哈希与一致性哈希 在分布式系统中&#xff0c;哈希和一致性哈希是数据索引或者数据分布的常见实现方式。 数据分布设计原则 在分布式数据存储系统中&#xff0c;做存储方案选型时&#xff0c;一般会考虑以下因素&#xff1a; 数据均匀数据稳定节点异构性隔离故障域性能稳定…

Delphi Http Https 最好的解决方法(三) LoadLibrary扩展

开发环境: Delphi XE 10.1 Berlin 前提文章: Delphi Http Https 最好的解决方法(二) 目录 1. 项目描述 2. 问题描述 3. 解决方案 3.1 主程序在导入dll方法单元处理(不推荐) 3.2 在dll的工程文件处加入(不推荐) 3.3 在dll的工程文件获取dll(HelpTool.dll)的当前路径(推荐方…

gitlab 安装到项目上传一篇解决

文章目录1.安装1.1创建挂载目录1.2启动1.3 配置gitlab查看docker admin 账户初始密码注册普通用户2.1进入注册2.2创建后通过登录admin审批3.2 步骤13.2 步骤23.3步骤33.4 项目添加成员4 使用成员用户,上传到新建的项目中4.1 复制项目地址4.2使用 git here 克隆项目4.3进入下载目…