当前位置: 首页 > news >正文

前端常用 utils 工具封装


// 函数防抖
export function debounce(fn, interval) {let timerreturn function (this, ...args) {clearTimeout(timer)const context = thislet params = [...args]timer = setTimeout(() => {fn.call(context, ...params)}, interval || 1000)}
}// 函数节流
export function throttle(fn, interval) {let timer = nullreturn function (this, ...args) {const context = thislet params = [...args]if (!timer) {timer = setTimeout(() => {fn.call(context, ...params)timer = null}, interval || 1000)}}
}// 对象数组去重(Map 新的写法,可能不兼容 低版本的浏览器)
export function uniqueArr(arr = [], key) {return Array.from(new Map(arr.map((item) => [item[key], item])))
}// 对象数组去重(老语法)
export function oldUniqueArr(arr = [], key) {if (!key) return new Error("请传入 key")const tempObj = {}const newArray = []for (let i = 0; i < arr.length; i++) {const item = arr[i];if (!tempObj.hasOwnProperty(item[key])) {tempObj[item[key]] = itemnewArray.push(item)}}return newArray
}// 多维数组转成一维数组
export function flattenArray(arr) {return arr.reduce((acc, item) => {return acc.concat(Array.isArray(item) ? flattenArray(item) : item)}, [])
}// 二维数组根据指定的key 转成一维数组
export function flattenAndUniqueByKey(arr, key) {// Array.prototype.flat() 方法将二维数组扁平化为一维数组。const flatArray = arr.flat();// 使用 Map 去重const uniqueMap = new Map();flatArray.forEach(item => {uniqueMap.set(item[key], item);});return Array.from(uniqueMap.values());
}// 二维数组根据指定的key 转成一维数组(旧版语法)
export function oldFlattenAndUniqueByKey(arr, key) {let uniqueObj = {}let uniqueArray = []arr.reduce((acc, childArr) => {childArr.forEach(item => {// 根据传入的 key,做 keyuniqueObj[item[key]] = item;})return acc}, [])for (const key in uniqueObj) {uniqueArray.push(uniqueObj[key])}return uniqueArray
}// const url = 'https://example.com/page?name=Alice&age=30&city=Wonderland';
// 获取 url 参数
export function getQueryParams(url) {const queryParams = {};// 找到 URL 中的查询字符串部分const queryString = url.split('?')[1];// 将查询字符串按 & 分割为参数对const pairs = queryString.split('&');// 遍历每个参数对pairs.forEach(pair => {const [key, value] = pair.split('=');// 对值进行解码并存储到对象中queryParams[decodeURIComponent(key)] = decodeURIComponent(value || '');});return queryParams;
}// 判断两个对象是否相等
export function objectIsEqual(a, b) {if (!a || !b) return falseconst aProps = Object.getOwnPropertyNames(a)const bProps = Object.getOwnPropertyNames(b)if (aProps.length !== bProps.length) return falsefor (let i = 0; i < aProps.length; i++) {const propName = aProps[i]const propA = a[propName]const propB = b[propName]if (!b.hasOwnProperty(propName)) return falseif (propA instanceof Object) {if (!isObjectValueEqual(propA, propB)) return false} else if (propA !== propB) {return false}}return true
}// 延迟执行
export function delay(time) {return new Promise(resolve => setTimeout(resolve, time))
}// 正则验证手机号
export function isPhone(str = "") {const phoneRex =/^[1](([3][0-9])|([4][0,1,4-9])|([5][0-3,5-9])|([6][2,5,6,7])|([7][0-8])|([8][0-9])|([9][0-3,5-9]))[0-9]{8}$/return phoneRex.test(str)
}// 获取数据类型
export function typeOfData(data) {return Object.prototype.toString.call(data).slice(8, -1)
}export function buildTree(items, parentKey = 'parentId', idKey = 'id', rootParentId = null) {// 创建一个 map 来存储每个 id 和其对应的节点const itemMap = new Map();// 遍历数组,初始化每个节点items.forEach(item => {itemMap.set(item[idKey], { ...item, children: [] });});// 组装树形结构const tree = [];itemMap.forEach(node => {const parentId = node[parentKey];if (parentId === rootParentId) {// 如果节点的 parentKey 与 rootParentId 匹配,则为树的根节点tree.push(node);} else {// 否则,找到其父节点,并将其添加到父节点的 children 数组中const parentNode = itemMap.get(parentId);if (parentNode) {parentNode.children.push(node);}}});return tree;
}// 时间格式化
// date 对象 dateFormat("YYYY-mm-dd HH:MM:ss", new Date(毫秒级时间戳)),
export function dateFormat(fmtStr, date) {let fmt = fmtStrlet retconst opt = {"Y+": date.getFullYear().toString(), // 年"m+": (date.getMonth() + 1).toString(), // 月"d+": date.getDate().toString(), // 日"H+": date.getHours().toString(), // 时"M+": date.getMinutes().toString(), // 分"S+": date.getSeconds().toString(), // 秒"s+": date.getMilliseconds().toString(),// 有其他格式化字符需求可以继续添加,必须转化成字符串}for (const k in opt) {if (Object.prototype.hasOwnProperty.call(opt, k)) {ret = new RegExp(`(${k})`).exec(fmt)if (ret) {fmt = fmt.replace(ret[1], ret[1].length === 1 ? opt[k] : opt[k].padStart(ret[1].length, "0"))}}}return fmt
}

相关文章:

前端常用 utils 工具封装

// 函数防抖 export function debounce(fn, interval) {let timerreturn function (this, ...args) {clearTimeout(timer)const context thislet params [...args]timer setTimeout(() > {fn.call(context, ...params)}, interval || 1000)} }// 函数节流 export functio…...

项目都做完了,领导要求国际化????--JAVA后端篇

springboot项目国际化相信各位小伙伴都会&#xff0c;很简单&#xff0c;但是怎么项目都做完了&#xff0c;领导却要求国际化文件就很头疼了 国际化的SpringBoot代码&#xff1a; 第一步&#xff1a;创建工具类 /*** 获取i18n资源文件** author bims*/ public class Message…...

国内备受好评PostgreSQL数据库性能如何?

为什么国内很多数据库采用PostgreSQL数据库作为基础&#xff0c;再次开发自己的产品呢?不仅仅是因为PostgreSQL数据库开源免费、PostgreSQL 数据库的性能也是相当出色的&#xff0c;具有以下几个方面的特点&#xff1a; 1. 处理大规模数据&#xff1a; - 能够有效地管理和处…...

彻底搞懂前端跨域解决方案

一、浏览器的同源策略 1、同源策略概述 同源策略是浏览器为确保资料安全&#xff0c;而遵循的一种策略&#xff0c;该策略对访问资源进行了一些限制。 2、什么是源&#xff08;origin&#xff09;&#xff1f; 3、示例 4、同源请求 5、非同源请求 二、跨域会受到哪些限制 1…...

Kafka基础概念

MQ消息中间件 1&#xff09;总览&#xff1a; 消息中间件 这里我们主要学习的是kafka的基础概念 具体参考黑马头条&#xff1a;https://www.bilibili.com/video/BV1Qs4y1v7x4/?spm_id_from333.337.search-card.all.click 2&#xff09;消息中间件对比 3&#xff09;Kafka介…...

【论文阅读笔记】DeepCAD: A Deep Generative Network for Computer-Aided Design Models

1 引言 现有3D生成模型&#xff1a; 3D点云&#xff1a;大量离散的3D点组成的数据表示形式&#xff1b; 多边形网格&#xff1a;一系列相连的多边形组成的3D模型&#xff1b; 水平集场&#xff1a;使用数值函数来表示物体的边界&#xff0c;并根据函数值的正负来确定物体内部…...

《如鸢》开通官号,女性向游戏爆款预定

今天&#xff0c;备受瞩目的沉浸式剧情卡牌手游《如鸢》正式开通了官方社媒账号并发布了玩家信。 《如鸢》由灵犀互娱倾力打造&#xff0c;游戏不仅拥有跌宕起伏的权谋剧情&#xff0c;更采用Live2D技术&#xff0c;为玩家带来沉浸式的游戏体验&#xff0c;吸引了众多玩家关注。…...

OpenAI再下一城:发布Voice Engine,可使用文本和参考语音合成说话者的新语音!

转自 机器学习算法工程师 OpenAI又发布了一个最新的工作&#xff1a;Voice Engine。Voice Engine可以使用文本输入和单个 15 秒音频样本生成听起来自然且与原始说话者非常相似的语音。而且&#xff0c;一个小型模型仅通过一个 15 秒的样本就能创造出富有情感且逼真的语音。Voi…...

KVM高级功能部署

一、概述 KVM&#xff08;Kernel-based Virtual Machine&#xff09;是一种基于内核的虚拟化技术&#xff0c;它依赖于CPU的虚拟化扩展&#xff08;如Intel VT和AMD-V&#xff09;来实现虚拟机的创建、管理和调度。KVM虚拟化技术因其高效、稳定的特点&#xff0c;在云计算和企…...

【C语言】柔性数组(打开前所未见的大门)

文章目录 前言柔性数组1.1 概念1.2 柔性数组的特点1.3 柔性数组的使用1.4 柔性数组的优势 总结 前言 说到柔性数组&#xff0c;相信有很多学过C语言的读者都不知道这是个什么东西。不过没有关系&#xff0c;相信本章能够带你从到认识到掌握柔性数组&#xff0c;做一个充满知识…...

设计模式17-适配模式

设计模式17-适配模式 动机定义与结构C代码推导总结应用具体应用示例 动机 在软件系统中由于应用环境的变化常常需要将一些现存的对象。放到新的环境中去应用。但是新环境要求的接口是这些现存对象所不满足的。那么这种情况下如何应对这种迁移的变化&#xff1f;如何既能利用现…...

react ant Input defaultValue={value}设置了value值以后,但是defalult没有赋值上,输入框也没有显示

在 React 中&#xff0c;defaultValue 是一个非受控属性&#xff0c;而 value 是一个受控属性。这两个属性都可以用于设置 Input 组件的值&#xff0c;但是它们的工作方式有所不同。 value&#xff1a;这是一个受控属性&#xff0c;意味着输入框的值由 React 状态控制。每当状态…...

大模型开发如何把一段文字变成一组token?

在大模型开发中&#xff0c;将一段文字变成一组token通常称为"tokenization"&#xff08;分词&#xff09;。这是自然语言处理中的一个关键步骤&#xff0c;主要是将连续的文本划分成离散的单元&#xff08;token&#xff09;&#xff0c;这些单元可以是单词、子词或…...

【MSYS】Windows Terminal 集成

Windows Terminal 集成 MSYS2安装在默认位置C:\msys64打开Windows Terminal打开JSON配置文件文件。 添加如下配置&#xff1a; "profiles": {"defaults": {},"list": [{"guid": "{71160544-14d8-4194-af25-d05feeac7233}"…...

Python酷库之旅-第三方库Pandas(056)

目录 一、用法精讲 211、pandas.Series.truncate方法 211-1、语法 211-2、参数 211-3、功能 211-4、返回值 211-5、说明 211-6、用法 211-6-1、数据准备 211-6-2、代码示例 211-6-3、结果输出 212、pandas.Series.where方法 212-1、语法 212-2、参数 212-3、功能…...

ZBrush入门使用介绍——4、笔刷选项说明

大家好&#xff0c;我是阿赵。   这次来看看ZBrush的笔刷的选项用法。 一、选择笔刷 点击笔刷&#xff0c;可以打开笔刷选择面板。 在最上面的Quick Pick&#xff0c;有最近使用过的笔刷&#xff0c;可以快速的选择。下面有很多可以选择的笔刷。但由于笔刷太多&#xff0c;…...

Java每日一练,技术成长不间断

目录 题目1.下列关于继承的哪项叙述是正确的&#xff1f;2.Java的跨平台特性是指它的源代码可以在多个平台运行。&#xff08;&#xff09;3.以下 _____ 不是 Object 类的方法4.以下代码&#xff1a;5.下面哪个流类不属于面向字符的流&#xff08;&#xff09;总结 题目 选自牛…...

传知代码-上下位关系自动检测方法(论文复现)

代码以及视频讲解 本文所涉及所有资源均在传知代码平台可获取 概述 本文复现论文 Hearst patterns revisited: Automatic hypernym detection from large text corpora[1] 提出的文本中上位词检测方法。 在自然语言处理中&#xff0c;上下位关系&#xff08;Is-a Relations…...

从零开始的MicroPython(二) GPIO及代码应用

上一篇&#xff1a;http://t.csdnimg.cn/mg2Qt 文章目录 ESP32(NodeMCU-32S)简介引脚注意事项 类与对象的概念MicroPython的GPIO使用文档解释machine.PinPin.irq 点灯 ESP32(NodeMCU-32S) 简介 NodeMCU-32S 是安信可基于 ESP32-32S 模组所设计的核心开发板。该开发板延续了 N…...

嵌入式day15

数组指针 能够指向整个数组 一维数组&#xff1a; &a&#xff0c;考察a的数据类型 int&#xff08;*p&#xff09;[10]&#xff1a;表示一个指向长度为10的一维整型数组的指针 二维数组&#xff1a; 指向函数的指针 函数的函数名&#xff0c;即为函数的入口地址&#x…...

【电池管理系统(BMS)-01】 | 电池管理系统简介,动力电池和储能电池区别

&#x1f3a9; 欢迎来到技术探索的奇幻世界&#x1f468;‍&#x1f4bb; &#x1f4dc; 个人主页&#xff1a;一伦明悦-CSDN博客 ✍&#x1f3fb; 作者简介&#xff1a; C软件开发、Python机器学习爱好者 &#x1f5e3;️ 互动与支持&#xff1a;&#x1f4ac;评论 &…...

C++ STL partial_sum 用法

一&#xff1a;功能 计算部分和&#xff0c;即遍历序列中每个元素&#xff0c;计算前 i 个元素的累加和&#xff0c;并将结果存在 i 的位置上。 二&#xff1a;用法 #include <iostream> #include <vector> #include <numeric>int main() {std::vector<…...

诚宜开张圣听不应妄自菲薄

拾人牙慧孜孜不倦 青山依旧在几度夕阳红朝闻道夕死可矣 青山依旧在几度夕阳红 安能以血补天我计不成乃天命也臣本布衣躬耕南阳大丈夫宁死不辱尔要试我宝剑是否锋利吗又待怎样休教天下人负我竖子不足与谋皇天不佑天下英雄唯使君与操尔青光殷殷其灿如炎备不量力欲申大义于天下我…...

Vue3 加载条(LoadingBar)

效果如下图&#xff1a;在线预览 APIs LoadingBar 参数说明类型默认值必传containerClass加载条容器的类名stringundefinedfalsecontainerStyle加载条容器的样式CSSProperties{}falseloadingBarSize加载条大小&#xff0c;单位 pxnumber2falsecolorLoading加载中颜色string‘…...

《CSS创意项目实战指南》:点亮网页,从实战中掌握CSS的无限创意

CSS创意项目实战指南 在数字时代&#xff0c;网页不仅是信息的载体&#xff0c;更是艺术与技术的融合体。通过CSS&#xff0c;你可以将平凡的网页转变为引人入胜的视觉盛宴&#xff0c;让用户体验跃升至全新高度。《CSS创意项目实战指南》正是这样一本引领你探索CSS无限可能的…...

[FBCTF2019]RCEService (PCRE回溯绕过和%a0换行绕过)

json格式输入ls出现index.php 这道题原本是给了源码的&#xff0c;BUUCTF没给 源码&#xff1a; <?phpputenv(PATH/home/rceservice/jail);if (isset($_REQUEST[cmd])) {$json $_REQUEST[cmd];if (!is_string($json)) {echo Hacking attempt detected<br/><br/…...

vue3后台管理系统 vue3+vite+pinia+element-plus+axios上

前言 项目安装与启动 使用vite作为项目脚手架 # pnpm pnpm create vite my-vue-app --template vue安装相应依赖 # sass pnpm i sass # vue-router pnpm i vue-router # element-plus pnpm i element-plus # element-plus/icon pnpm i element-plus/icons-vue安装element-…...

Mysql的事务隔离级别实现原理

一、事务隔离级别 mysql支持四种事务隔离级别&#xff1a; 读未提交&#xff1a;一个事务可以读取到另一个事务还未提交的数据&#xff1b;读已提交&#xff1a;一个事务可以读取到另一个事务已经提交的数据&#xff1b;可重复读&#xff1a;同一个事务中&#xff0c;无论读取…...

计算机体系结构:缓存一致性ESI

集中式缓存处理器结构&#xff08;SMP&#xff09; 不同核访问存储器时间相同。 分布式缓存处理器结构&#xff08;NUMA&#xff09; 共享存储器按模块分散在各处理器附近&#xff0c;处理器访问本地存储器和远程存储器的延迟不同&#xff0c;共享数据可进入处理器私有高速缓存…...

log4j2漏洞练习(未完成)

log4j2 是Apache的一个java日志框架&#xff0c;我们借助它进行日志相关操作管理&#xff0c;然而在2021年末log4j2爆出了远程代码执行漏洞&#xff0c;属于严重等级的漏洞。apache log4j通过定义每一条日志信息的级别能够更加细致地控制日志生成地过程&#xff0c;受影响的版本…...