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

【JS封装-工具函数】强化编程实践:精选JavaScript函数封装集锦-关于工具函数 (如深度克隆、浅拷贝、递归、防抖和节流等)

目录

浅拷贝

深度克隆

递归函数示例:计算数组深度

防抖函数

节流函数

扁平化数组

检查对象是否为空

生成随机字符串

深度比较两个对象是否相等


浅拷贝

/*** 浅拷贝对象或数组。* @param {Object|Array} obj 要拷贝的对象或数组。* @returns {Object|Array} 新的拷贝对象或数组。*/
function shallowClone(obj) {if (Array.isArray(obj)) return obj.slice();if (typeof obj === 'object' && obj !== null) return Object.assign({}, obj);return obj;
}

深度克隆

/*** 深度克隆对象或数组。* @param {Object|Array} obj 要克隆的对象或数组。* @returns {Object|Array} 完全独立的新克隆对象或数组。*/
function deepClone(obj) {if (obj === null || typeof obj !== 'object') return obj;let clone = Array.isArray(obj) ? [] : {};for (let key in obj) {if (obj.hasOwnProperty(key)) {clone[key] = deepClone(obj[key]);}}}return clone;
}

递归函数示例:计算数组深度

/*** 计算数组的最大深度。* @param {Array} arr 输入数组。* @returns {number} 数组的深度。*/
function calculateDepth(arr) {let maxDepth = 0;arr.forEach(item => {if (Array.isArray(item)) {maxDepth = Math.max(maxDepth, calculateDepth(item) + 1);}});return maxDepth;
}

防抖函数

/*** 防抖函数,限制函数在一段时间内只执行一次。* @param {Function} func 要执行的函数。* @param {number} wait 延迟执行的时间(毫秒)。* @returns {Function} 返回防抖处理后的函数。*/
function debounce(func, wait) {let timeout;return function(...args) {clearTimeout(timeout);timeout = setTimeout(() => func.apply(this, args), wait);};
}

节流函数

/*** 节流函数,确保函数在规定时间内只执行一次。* @param {Function} func 要执行的函数。* @param {number} delay 规定的时间间隔(毫秒)。* @returns {Function} 返回节流处理后的函数。*/
function throttle(func, delay) {let lastExec = 0;return function(...args) {const now = Date.now();if (now - lastExec >= delay) {lastExec = now;func.apply(this, args);}};
}

扁平化数组

/*** 将嵌套数组扁平化为一维数组。* @param {Array} arr 原数组。* @param {number} [depth=Infinity] 扁平化的深度,默认无限深。* @returns {Array} 扁平化后的数组。*/
function flattenArray(arr, depth = Infinity) {return arr.reduce((acc, val) => Array.isArray(val) && depth > 0 ? acc.concat(flattenArray(val, depth - 1)) : acc.concat(val), []);
}

检查对象是否为空

/*** 检查对象是否为空(没有可枚举属性)。* @param {Object} obj 待检查的对象。* @returns {boolean} 如果对象为空返回true,否则返回false。*/
function isEmptyObject(obj) {return Object.keys(obj).length === 0;
}

生成随机字符串

/*** 生成指定长度的随机字符串。* @param {number} length 字符串长度。* @returns {string} 随机字符串。*/
function generateRandomString(length) {let result = '';const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';const charactersLength = characters.length;for (let i = 0; i < length; i++) {result += characters.charAt(Math.floor(Math.random() * charactersLength));}return result;
}

深度比较两个对象是否相等

/*** 深度比较两个对象是否相等。* @param {Object} obj1 对象1。* @param {Object} obj2 对象2。* @returns {boolean} 如果两个对象相等返回true,否则返回false。*/
function deepEqual(obj1, obj2) {if (obj1 === obj2) return true;if (typeof obj1 !== 'object' || obj1 === null || typeof obj2 !== 'object' || obj2 === null) {return false;}const keys1 = Object.keys(obj1);const keys2 = Object.keys(obj2);if (keys1.length !== keys2.length) return false;for (const key of keys1) {if (!keys2.includes(key) || !deepEqual(obj1[key], obj2[key])) {return false;}}}return true;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【Python】使用 SQLObject orm 库快速将接口数据存入数据库
  • 家族企业如何找到合适的人才
  • 存在 ZooKeeper 未授权访问【原理扫描】--通过防火墙策略进行修复
  • Qt实现程序单实例运行(只能运行1个进程)及QSharedMemory用法
  • 【Vue】智慧商城
  • 使用Docker辅助图像识别程序开发:在Docker中显示GUI、访问GPU、USB相机以及网络
  • Robust Tiny Object Detection in Aerial Images amidst Label Noise
  • 第53集《摄大乘论》
  • 高中数学:数列-基础概念
  • 【清华大学】《自然语言处理》(刘知远)课程笔记 ——NLP Basics
  • 【计算机毕业设计】283基于微信小程序校园订餐
  • 20.水仙花指数
  • SpringBoot整合钉钉实现消息推送
  • 河海大学上岸经验分享!
  • 数据中心网络架构设计与优化
  • 03Go 类型总结
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • fetch 从初识到应用
  • javascript从右向左截取指定位数字符的3种方法
  • Lucene解析 - 基本概念
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • Redis的resp协议
  • spring boot 整合mybatis 无法输出sql的问题
  • SQLServer之创建数据库快照
  • vue-router的history模式发布配置
  • Vue组件定义
  • 给github项目添加CI badge
  • 欢迎参加第二届中国游戏开发者大会
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 用mpvue开发微信小程序
  • 主流的CSS水平和垂直居中技术大全
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • ​2021半年盘点,不想你错过的重磅新书
  • #162 (Div. 2)
  • $.ajax,axios,fetch三种ajax请求的区别
  • (12)Linux 常见的三种进程状态
  • (2015)JS ES6 必知的十个 特性
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (SERIES10)DM逻辑备份还原
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (十六)、把镜像推送到私有化 Docker 仓库
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • *** 2003
  • .aanva
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .NET Core 中的路径问题
  • .NET DevOps 接入指南 | 1. GitLab 安装
  • .NET 某和OA办公系统全局绕过漏洞分析
  • .Net 知识杂记
  • @Autowired和@Resource的区别
  • @ComponentScan比较