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

JavaScript系列(8)-- Array高级操作

JavaScript Array高级操作 📚

在前七篇文章中,我们探讨了JavaScript的语言特性、ECMAScript标准、引擎工作原理、数值类型、字符串处理、Symbol类型和Object高级特性。今天,让我们深入了解JavaScript中的Array高级操作。数组是最常用的数据结构之一,掌握其高级操作可以让我们更优雅地处理数据。

数组基础回顾 🌟

💡 小知识:JavaScript中的数组实际上是一种特殊的对象,它的索引是字符串类型的数字,并且有一个特殊的length属性。这种实现方式使得JavaScript数组比传统的数组更灵活,但在某些情况下性能可能不如传统数组。

数组的创建和初始化 📊

// 1. 数组创建的多种方式
function arrayCreation() {// 字面量方式const arr1 = [1, 2, 3, 4, 5];// 构造函数方式const arr2 = new Array(3);  // 创建长度为3的空数组const arr3 = new Array(1, 2, 3);  // 创建包含1,2,3的数组// Array.from方式const arr4 = Array.from('hello');  // ['h', 'e', 'l', 'l', 'o']const arr5 = Array.from({ length: 5 }, (_, i) => i + 1);  // [1, 2, 3, 4, 5]// Array.of方式const arr6 = Array.of(3);  // [3]const arr7 = Array.of(1, 2, 3);  // [1, 2, 3]// 扩展运算符const existing = [1, 2, 3];const arr8 = [...existing, 4, 5];  // [1, 2, 3, 4, 5]
}// 2. 类型化数组
function typedArrays() {// 创建类型化数组const int8Array = new Int8Array(4);const uint8Array = new Uint8Array(4);const int16Array = new Int16Array(4);const float32Array = new Float32Array(4);const float64Array = new Float64Array(4);// 从普通数组创建const numbers = [1, 2, 3, 4];const typed = new Int32Array(numbers);// 类型化数组的操作typed[0] = 10;console.log(typed.byteLength);  // 字节长度console.log(typed.buffer);      // 底层ArrayBuffer
}// 3. 数组缓冲区和视图
function arrayBuffers() {// 创建ArrayBufferconst buffer = new ArrayBuffer(16);// 创建不同的视图const int32View = new Int32Array(buffer);const float64View = new Float64Array(buffer);const uint8View = new Uint8Array(buffer);// 通过视图操作数据int32View[0] = 42;console.log(uint8View[0]);  // 查看字节级表示
}

数组操作方法 🔧

JavaScript提供了丰富的数组操作方法:

// 1. 基本操作
function basicOperations() {const arr = [1, 2, 3, 4, 5];// 添加和删除元素arr.push(6);           // 末尾添加arr.unshift(0);        // 开头添加arr.pop();             // 末尾删除arr.shift();           // 开头删除// 切片和拼接const slice = arr.slice(1, 3);    // 复制部分数组const spliced = arr.splice(1, 2, 'a', 'b');  // 替换元素// 合并数组const arr1 = [1, 2];const arr2 = [3, 4];const combined = arr1.concat(arr2);// 或使用扩展运算符const combined2 = [...arr1, ...arr2];
}// 2. 高阶函数操作
function higherOrderOperations() {const numbers = [1, 2, 3, 4, 5];// map: 转换每个元素const doubled = numbers.map(x => x * 2);// filter: 筛选元素const evens = numbers.filter(x => x % 2 === 0);// reduce: 累积计算const sum = numbers.reduce((acc, cur) => acc + cur, 0);// find/findIndex: 查找元素const found = numbers.find(x => x > 3);const foundIndex = numbers.findIndex(x => x > 3);// every/some: 条件检查const allPositive = numbers.every(x => x > 0);const hasEven = numbers.some(x => x % 2 === 0);// flatMap: 映射并展平结果const pairs = numbers.flatMap(x => [x, x * 2]);
}// 3. 排序和搜索
function sortingAndSearching() {const items = [{ name: '苹果', price: 5 },{ name: '香蕉', price: 3 },{ name: '橙子', price: 4 }];// 基本排序items.sort((a, b) => a.price - b.price);// 自定义排序items.sort((a, b) => {if (a.name < b.name) return -1;if (a.name > b.name) return 1;return 0;});// 二分查找const numbers = [1, 3, 5, 7, 9, 11];const index = numbers.indexOf(7);// 自定义二分查找function binarySearch(arr, target) {let left = 0;let right = arr.length - 1;while (left <= right) {const mid = Math.floor((left + right) / 2);if (arr[mid] === target) return mid;if (arr[mid] < target) left = mid + 1;else right = mid - 1;}return -1;}
}

数组的高级技巧 🎯

让我们看看一些高级的数组操作技巧:

// 1. 数组去重
function arrayDeduplication() {// 使用Setfunction uniqueArray1(arr) {return [...new Set(arr)];}// 使用filterfunction uniqueArray2(arr) {return arr.filter((item, index) => arr.indexOf(item) === index);}// 使用reducefunction uniqueArray3(arr) {return arr.reduce((unique, item) => unique.includes(item) ? unique : [...unique, item], []);}// 对象数组去重function uniqueObjectArray(arr, key) {const seen = new Set();return arr.filter(item => {const value = item[key];if (seen.has(value)) return false;seen.add(value);return true;});}
}// 2. 数组分组和分块
function arrayGrouping() {// 按条件分组function groupBy(arr, key) {return arr.reduce((groups, item) => {const value = typeof key === 'function' ? key(item) : item[key];(groups[value] = groups[value] || []).push(item);return groups;}, {});}// 分块function chunk(arr, size) {return Array.from({ length: Math.ceil(arr.length / size) },(_, i) => arr.slice(i * size, (i + 1) * size));}// 按数量分割function partition(arr, n) {const size = Math.ceil(arr.length / n);return chunk(arr, size);}
}// 3. 数组交集、并集和差集
function arraySetOperations() {// 交集function intersection(arr1, arr2) {return arr1.filter(item => arr2.includes(item));}// 并集function union(arr1, arr2) {return [...new Set([...arr1, ...arr2])];}// 差集function difference(arr1, arr2) {return arr1.filter(item => !arr2.includes(item));}// 对称差集function symmetricDifference(arr1, arr2) {return arr1.filter(item => !arr2.includes(item)).concat(arr2.filter(item => !arr1.includes(item)));}
}

数组性能优化 ⚡

处理大型数组时的性能优化技巧:

// 1. 预分配内存
function memoryPreallocation() {// 预分配数组大小const n = 1000000;const arr = new Array(n);// 不好的做法const dynamicArr = [];for (let i = 0; i < n; i++) {dynamicArr.push(i);  // 可能导致多次重新分配内存}// 好的做法const preallocatedArr = new Array(n);for (let i = 0; i < n; i++) {preallocatedArr[i] = i;}
}// 2. 批量操作优化
function batchOperations() {// 使用TypedArray进行数值计算function computeSum(arr) {const typed = new Float64Array(arr);let sum = 0;for (let i = 0; i < typed.length; i++) {sum += typed[i];}return sum;}// 批量插入优化function batchInsert(arr, items) {const temp = [...arr];temp.push(...items);return temp;}
}// 3. 迭代器优化
function iteratorOptimization() {// 使用for...of代替forEachfunction sumArray(arr) {let sum = 0;for (const num of arr) {sum += num;}return sum;}// 使用迭代器处理大数据function* chunks(arr, size) {for (let i = 0; i < arr.length; i += size) {yield arr.slice(i, i + size);}}
}

实际应用场景 💼

让我们看看数组在实际开发中的一些应用:

// 1. 数据处理
class DataProcessor {// 数据转换static transform(data, transformers) {return data.map(item => transformers.reduce((acc, transformer) => transformer(acc), item));}// 数据过滤和排序static filterAndSort(data, filters, sorter) {return data.filter(item => filters.every(filter => filter(item))).sort(sorter);}// 数据聚合static aggregate(data, groupBy, aggregator) {const groups = this.groupBy(data, groupBy);return Object.entries(groups).map(([key, group]) => ({key,value: aggregator(group)}));}
}// 2. 虚拟列表
class VirtualList {constructor(data, pageSize) {this.data = data;this.pageSize = pageSize;this.currentPage = 0;}getCurrentPage() {const start = this.currentPage * this.pageSize;return this.data.slice(start, start + this.pageSize);}next() {if (this.hasNext()) {this.currentPage++;return this.getCurrentPage();}return [];}previous() {if (this.hasPrevious()) {this.currentPage--;return this.getCurrentPage();}return [];}hasNext() {return (this.currentPage + 1) * this.pageSize < this.data.length;}hasPrevious() {return this.currentPage > 0;}
}// 3. 数据缓存
class ArrayCache {constructor(maxSize = 1000) {this.maxSize = maxSize;this.cache = new Map();}set(key, array) {if (this.cache.size >= this.maxSize) {const firstKey = this.cache.keys().next().value;this.cache.delete(firstKey);}this.cache.set(key, array);}get(key) {return this.cache.get(key);}has(key) {return this.cache.has(key);}clear() {this.cache.clear();}
}

最佳实践建议 💡

  1. 数组操作最佳实践
// 1. 避免稀疏数组
function avoidSparseArrays() {// 不好的做法const sparse = [1, , 3];// 好的做法const dense = [1, null, 3];// 转换稀疏数组为密集数组const densified = sparse.filter(() => true);
}// 2. 使用合适的数组方法
function chooseRightMethods() {const arr = [1, 2, 3, 4, 5];// 查找元素// 不好的做法const found1 = arr.filter(x => x === 3)[0];// 好的做法const found2 = arr.find(x => x === 3);// 转换数组// 不好的做法const transformed1 = arr.reduce((acc, x) => [...acc, x * 2], []);// 好的做法const transformed2 = arr.map(x => x * 2);
}// 3. 性能考虑
function performanceConsiderations() {// 避免频繁修改数组长度const arr = [];const n = 1000;// 不好的做法for (let i = 0; i < n; i++) {arr.push(i);}// 好的做法const arr2 = Array.from({ length: n }, (_, i) => i);
}
  1. 错误处理和验证
// 1. 数组验证
function validateArray(arr) {if (!Array.isArray(arr)) {throw new TypeError('参数必须是数组');}if (arr.length === 0) {throw new Error('数组不能为空');}return true;
}// 2. 安全的数组操作
function safeArrayOperations() {function safeGet(arr, index, defaultValue = null) {if (!Array.isArray(arr)) return defaultValue;if (index < 0 || index >= arr.length) return defaultValue;return arr[index];}function safeSplice(arr, start, deleteCount, ...items) {const copy = [...arr];copy.splice(start, deleteCount, ...items);return copy;}
}// 3. 类型检查
function arrayTypeChecking() {function isNumberArray(arr) {return Array.isArray(arr) && arr.every(x => typeof x === 'number');}function isObjectArray(arr) {return Array.isArray(arr) && arr.every(x => x && typeof x === 'object');}
}

结语 📝

JavaScript的数组操作非常强大和灵活,掌握这些高级操作可以帮助我们更好地处理数据。我们学习了:

  1. 数组的创建和初始化方法
  2. 常用的数组操作方法
  3. 高级数组操作技巧
  4. 性能优化和最佳实践
  5. 实际应用场景

💡 学习建议:在处理数组时,要根据具体场景选择合适的方法,注意性能影响,特别是在处理大型数组时。同时,要注意数组操作的副作用,优先使用不改变原数组的方法。


如果你觉得这篇文章有帮助,欢迎点赞收藏,也期待在评论区看到你的想法和建议!👇

终身学习,共同成长。

咱们下一期见

💻

相关文章:

JavaScript系列(8)-- Array高级操作

JavaScript Array高级操作 &#x1f4da; 在前七篇文章中&#xff0c;我们探讨了JavaScript的语言特性、ECMAScript标准、引擎工作原理、数值类型、字符串处理、Symbol类型和Object高级特性。今天&#xff0c;让我们深入了解JavaScript中的Array高级操作。数组是最常用的数据结…...

蓝牙架构介绍

架构1&#xff1a;hostcontroller双芯片标准架构 这个标准把蓝牙协议栈分成host和controller两部分&#xff0c;其中host跑在AP上&#xff0c;controller跑在蓝牙模块上&#xff0c;两者之间通过HCI协议进行通信&#xff0c;AP芯片厂商一般会直接采用开源的Bluez来实现Host功能…...

青少年编程与数学 02-006 前端开发框架VUE 08课题、列表渲染

青少年编程与数学 02-006 前端开发框架VUE 08课题、列表渲染 一、列表渲染v-for 指令:key 属性遍历对象响应式更新列表渲染的作用 二、应用示例项目结构public/index.htmlsrc/components/TodoApp.vuesrc/main.jspackage.json构建和运行项目 课题摘要:本文介绍了Vue.js中的列表渲…...

12.3【hardware][day3]

关于使用硬件 DSP 资源实现乘法的含义 在 Xilinx 7 Series FPGA&#xff08;现场可编程门阵列&#xff09;中&#xff0c;乘法运算可以通过专门的数字信号处理&#xff08;DSP&#xff09;硬件资源来完成。当使用 Verilog 语言编写代码进行乘法运算时&#xff0c;直接使用乘号&…...

降维算法之PCA(PrincipalComponent Analysis,主成分分析)

降维是指在保留数据特征的前提下&#xff0c;以少量的变量表示有许多变量的数据&#xff0c;这有助于降低多变量数据分析的复杂度。比如在分析有 100 个变量的数据时&#xff0c;与其直接分析数据&#xff0c;不如使用 5 个变量表示数据&#xff0c;这样可以使后续分析比较容易…...

【JVM】总结篇-类的加载篇之 类的加载器 和ClassLoader分析

文章目录 类的加载器ClassLoader自定义类加载器双亲委派机制概念源码分析优势劣势如何打破Tomcat 沙箱安全机制JDK9 双亲委派机制变化 类的加载器 获得当前类的ClassLoader clazz.getClassLoader() 获得当前线程上下文的ClassLoader Thread.currentThread().getContextClassLoa…...

Android:文件管理:打开文件意图

三步走&#xff1a; 一、先在AndroidManifest.xml声明provider&#xff1a; <providerandroid:name"androidx.core.content.FileProvider"android:authorities"${applicationId}.FileProvider"android:exported"false"android:grantUriPermi…...

《计算机网络A》单选题(详解)

《计算机网络A》单选题-复习题库 1、计算机网络最突出的优点是&#xff08; D &#xff09; A、存储容量大 B、将计算机技术与通信技术相结合 C、集中计算 D、资源共享 解析&#xff1a;算机网络最突出的优点是 D、资源共享。通过计算机网络&…...

【SpringBoot3】Spring Boot 3.0 集成 Mybatis Plus

在Spring Boot 3.0中&#xff0c;你可以使用MyBatis Plus来简化数据库操作。以下是一个基本的集成示例&#xff1a; 1.添加依赖到你的pom.xml&#xff1a; <dependencies> <!-- Spring Boot Starter --> <dependency> <groupId>org.springframework.…...

第147场双周赛:子字符串匹配模式、设计任务管理器、最长相邻绝对差递减子序列、删除所有值为某个元素后的最大子数组和

Q1、子字符串匹配模式 1、题目描述 给你一个字符串 s 和一个模式字符串 p &#xff0c;其中 p 恰好 包含 一个 * 符号。 p 中的 * 符号可以被替换为零个或多个字符组成的任意字符序列。 如果 p 可以变成 s 的子字符串&#xff0c;那么返回 true &#xff0c;否则返回 false…...

数据结构C语言描述9(图文结合)--二叉树和特殊书的概念,二叉树“最傻瓜式创建”与前中后序的“递归”与“非递归遍历”

前言 这个专栏将会用纯C实现常用的数据结构和简单的算法&#xff1b;有C基础即可跟着学习&#xff0c;代码均可运行&#xff1b;准备考研的也可跟着写&#xff0c;个人感觉&#xff0c;如果时间充裕&#xff0c;手写一遍比看书、刷题管用很多&#xff0c;这也是本人采用纯C语言…...

开源存储详解-分布式存储与ceph

ceph体系结构 rados&#xff1a;reliable, autonomous, distributed object storage, rados rados采用c开发 对象存储 ceph严格意义讲只提供对象存储能力&#xff0c;ceph的块存储能力实际是基于对象存储库librados的rbd 对象存储特点 对象存储采用put/get/delete&#xf…...

Vue 快速入门:开启前端新征程

在当今的 Web 开发领域&#xff0c;Vue.js 作为一款极具人气的 JavaScript 前端框架&#xff0c;正被广泛应用于各类项目之中。它以简洁的语法、高效的数据绑定机制以及强大的组件化开发模式&#xff0c;为开发者们带来了前所未有的开发体验。如果你渴望踏入前端开发的精彩世界…...

GPT系统重大升级,开创国内先河:o1支持图片识别功能正式上线

文章目录 零、前言一、授权码登录体验优化&#xff1a;一步直达聊天界面二、全新“项目”功能&#xff1a;让工作更有条理三、语音功能升级&#xff1a;全新交互体验四、o1支持图片识别五、总结 零、前言 我是虚竹哥&#xff0c;目标是带十万人玩转ChatGPT。 亲爱的用户&…...

常用的数据结构API概览

List ArrayList 1、在初始化一个ArrayList的时候&#xff0c;如果我想同时set一些值 比如存放int[ ] List<int[]> list new ArrayList(Arrays.asList(new int[]{intervals[0][0],intervals[0][1]}));//或者int[] temp new int[]{intervals[0][0],intervals[0][1]}…...

《探秘计算机视觉与深度学习:开启智能视觉新时代》

《探秘计算机视觉与深度学习&#xff1a;开启智能视觉新时代》 一、追溯起源&#xff1a;从萌芽到崭露头角二、核心技术&#xff1a;解锁智能视觉的密码&#xff08;一&#xff09;卷积神经网络&#xff08;CNN&#xff09;&#xff1a;图像识别的利器&#xff08;二&#xff0…...

Linux:操作系统不朽的传说

操作系统是计算机的灵魂&#xff0c;它掌控着计算机的硬件和软件资源&#xff0c;为用户和应用程序提供了一个稳定、高效、安全的运行环境。 在众多操作系统中&#xff0c;Linux 的地位举足轻重。它被广泛应用于服务器、云计算、物联网、嵌入式设备等领域。Linux 的成功离不开…...

Excel重新踩坑5:二级下拉列表制作;★数据透视表;

0、在excel中函数公式不仅可以写在单元格里面&#xff0c;还可以写在公式里面。 1、二级下拉列表制作&#xff1a; 2、数据透视表&#xff1a; 概念&#xff1a;通过拖拉就能实现复杂函数才能实现的数据统计问题。 概览&#xff1a;在插入选项中有个数据透视表&#xff0c;数…...

containerd配置镜像加速(含新旧版本)

文章目录 镜像加速使用文档containerd配置说明文档host.toml配置步骤&#xff08;containerd2.x新版功能&#xff0c;与config.toml解耦&#xff0c;无需重启containerd&#xff09;传统配置&#xff08;需要重启containerd&#xff09; 镜像加速使用文档 关于镜像加速的使用可…...

国产编辑器EverEdit - 常用资源汇总

1 国产编辑器EverEdit-常用资源汇总 EverEdit是一款国产文本编辑器&#xff0c;历经超过15年的更新和维护&#xff0c;拥有不输业界顶级商业文本编辑器(EmEditor、UltraEdit)的实力&#xff0c;甚至在某些方面的功能更强(当然&#xff0c;各有千秋)&#xff0c;开发者对文本编辑…...

应急指挥系统总体架构方案

引言 应急指挥系统总体架构方案旨在构建一个高效、智能的应急管理体系&#xff0c;以应对自然灾害、事故灾难等突发事件&#xff0c;保障人民生命财产安全。 背景与挑战 近年来&#xff0c;安全生产形势严峻&#xff0c;自然灾害事故频发&#xff0c;对应急指挥系统的要求越…...

Edge Scdn的应用场景有哪些?

酷盾安全Edge Scdn 具备强大的安全防护能力&#xff0c;通过多层防御机制&#xff0c;如防火墙、DDoS 攻击防护、入侵检测和防御、数据加密等&#xff0c;有效抵御各种网络攻击&#xff0c;包括 DDoS 攻击、CC 攻击、SQL 注入攻击、XSS 跨站脚本攻击等&#xff0c;保障网站和应…...

LeetCode:98.验证二叉搜索树

跟着carl学算法&#xff0c;本系列博客仅做个人记录&#xff0c;建议大家都去看carl本人的博客&#xff0c;写的真的很好的&#xff01; 代码随想录 LeetCode&#xff1a;98.验证二叉搜索树 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 …...

mysql报错2059

客户端连接mysql服务时提示2059错误&#xff0c;通常与身份验证插件有关&#xff0c;具体表现为客户端无法加载指定的身份验证插件。这个错误在MySQL 8.0及更高版本中较为常见&#xff0c;因为从MySQL 8.0开始&#xff0c;默认的加密规则从mysql_native_password变为了caching_…...

2025/1/4期末复习 密码学 按老师指点大纲复习

我们都要坚信&#xff0c;道路越是曲折&#xff0c;前途越是光明。 --------------------------------------------------------------------------------------------------------------------------------- 现代密码学 第五版 杨波 第一章 引言 1.1三大主动攻击 1.中断…...

【数据仓库金典面试题】—— 包含详细解答

大家好&#xff0c;我是摇光~&#xff0c;用大白话讲解所有你难懂的知识点 该篇面试题主要针对面试涉及到数据仓库的数据岗位。 以下都是经典的关于数据仓库的问题&#xff0c;希望对大家面试有用~ 1、什么是数据仓库&#xff1f;它与传统数据库有何区别&#xff1f; 数据仓库…...

deepFM模型pytorch实现

deepFM deepfm包含两个部分&#xff1a;因子分解机FM和神经网络DNN&#xff0c;分别负责低阶特征和高阶特征的提取。可以处理全是分类特征的数据&#xff0c;或者分类与数值型结合的数据。 FM部分是对一阶特征和二阶特征&#xff08;一阶特征之间的交互&#xff09;的处理。 …...

【Linux】传输层协议UDP

目录 再谈端口号 端口号范围划分 UDP协议 UDP协议端格式 UDP的特点 UDP的缓冲区 UDP注意事项 进一步深刻理解 再谈端口号 在上图中&#xff0c;有两个客户端A和B&#xff0c;客户端A打开了两个浏览器&#xff0c;这两个客户端都访问同一个服务器&#xff0c;都访问服务…...

MOE怎样划分不同专家:K-Means聚类算法来实现将神经元特征聚类划分

MOE怎样划分不同专家:K-Means聚类算法来实现将神经元特征聚类划分 目录 MOE怎样划分不同专家:K-Means聚类算法来实现将神经元特征聚类划分MOE划分不同专家的方法K-Means聚类算法来实现将神经元特征聚类划分成不同专家(行或者列聚类)举例说明怎么聚类,最后神经网络怎么保存M…...

Redis两种主要的持久化方式是什么?

Redis支持两种主要的持久化方式&#xff0c;它们分别是RDB&#xff08;Redis Database Snapshotting&#xff09;和AOF&#xff08;Append Only File&#xff09;。以下是这两种持久化方式的详细介绍&#xff1a; 一、RDB&#xff08;Redis Database Snapshotting&#xff09; …...

【生活】冬天如何选口罩(医用口罩,N95, KN95还是KP95?带不带呼吸阀门?带不带活性炭?)

&#x1f4a1;总结一下就是&#xff1a; 日常防护的话&#xff0c;医用口罩就可以啦。要是想长时间佩戴N95&#xff08;KN95&#xff09;口罩的话也可以. 在高风险环境&#xff08;像医院、疫情防控期间&#xff09;&#xff0c;一定要选不带呼吸阀门的N95口罩KN95&#xff09…...

机器学习基础-卷积的计算

1 掌握卷积计算的基本过程 1.1 单通道单卷积核 如图3所示&#xff0c;现在有一张形状为[5,5,1]的灰度图&#xff0c;我们需要用图3右边的卷积核对其进行卷积处理&#xff0c;同时再考虑到偏置的作用。计算过程如下&#xff1a; 1.2 单通道多卷积核 如下图所示&#xff0c;左…...

使用LINUX的dd命令制作自己的img镜像

为了避免重复安装同一镜像&#xff0c;配置环境&#xff0c;首先我准备一个正常使用的完整系统。 使用Gparted软件先将母盘&#xff08;如U盘&#xff0c;TF卡&#xff09;分区调整为只有数据的大小。如&#xff1a;60G的TF卡&#xff0c;只用了3.5G&#xff0c;将未使用的空间…...

pdf预览兼容问题- chrome浏览器105及一下预览不了

使用的"tato30/vue-pdf": "^1.11.2"预览插件&#xff0c;发现chrome浏览器105及一下预览不了 pdfPreview预览组件&#xff1a; <template><div id"vue_pdf_view"><div class"tool_tip"><template v-if"pa…...

SpringBoot中实现拦截器和过滤器

【SpringBoot中实现过滤器和拦截器】 1.过滤器和拦截器简述 过滤器Filter和拦截器Interceptor&#xff0c;在功能方面很类似&#xff0c;但在具体实现方面差距还是比较大的。 2.过滤器的配置 2.1 自定义过滤器&#xff0c;实现Filter接口(SpringBoot 3.0 开始&#xff0c;jak…...

基于深度学习的视觉检测小项目(六) 项目的信号和变量的规划

• 关于前后端分离 当前流行的一种常见的前后端分离模式是vueflask&#xff0c;vueflask模式的前端和后端之间进行数据的传递通常是借助 API&#xff08;应用程序编程接口&#xff09;来完成的。vue通过调用后端提供的 API 来获取或提交数据。例如&#xff0c;前端可能通过发送…...

GitHub的简单操作

引言 今天开始就要开始做项目了&#xff0c;上午是要把git搭好。搭的过程中遇到好多好多的问题。下面就说一下git的简单操作流程。我们是使用的GitHub,下面也就以这个为例了 一、GitHub账号的登录注册 https://github.com/ 通过这个网址可以来到GitHub首页 点击中间绿色的S…...

LLM大语言模型自动化测试(ROUGE和RAGAS)及优化方案

1. 模型自动化测试 模型的测试中&#xff0c;不同类型的任务评测指标有显著差异&#xff0c;比如&#xff1a; 分类任务&#xff1a; 准确率&#xff08;Accuracy&#xff09;&#xff1a;正确预测的比例。 精确度&#xff08;Precision&#xff09;、召回率&#xff08;Recal…...

你已经分清JAVA中JVM、JDK与JRE的作用和关系了吗?

你已经分清JAVA中JVM、JDK与JRE的作用和关系了吗&#xff1f; 一. JVM、JDK与JRE的关系二. JVM、JDK与JRE的作用2.1 什么是JVM&#xff1f;2.2 什么是JDK&#xff1f;2.3 什么是JRE&#xff1f; 前言 点个免费的赞和关注&#xff0c;有错误的地方请指出&#xff0c;看个人主页有…...

实际开发中,常见pdf|word|excel等文件的预览和下载

实际开发中,常见pdf|word|excel等文件的预览和下载 背景相关类型数据之间的转换1、File转Blob2、File转ArrayBuffer3、Blob转ArrayBuffer4、Blob转File5、ArrayBuffer转Blob6、ArrayBuffer转File 根据Blob/File类型生成可预览的Base64地址基于Blob类型的各种文件的下载各种类型…...

Elasticsearch:Lucene 2024 年回顾

作者&#xff1a;来自 Elastic Chris Hegarty 2024 年对于 Apache Lucene 来说又是重要的一年。在本篇博文中&#xff0c;我们将探讨主要亮点。 Apache Lucene 在 2024 年表现出色&#xff0c;发布了许多版本&#xff0c;包括三年来的首次重大更新&#xff0c;其中包含令人兴奋…...

springboot实战纪实-课程介绍

教程介绍 Spring Boot是由Pivotal团队提供的一套开源框架&#xff0c;可以简化spring应用的创建及部署。它提供了丰富的Spring模块化支持&#xff0c;可以帮助开发者更轻松快捷地构建出企业级应用。 Spring Boot通过自动配置功能&#xff0c;降低了复杂性&#xff0c;同时支持…...

什么是TDD测试驱动开发(Test Driven Development)?

什么是测试驱动开发&#xff1f; 软件开发团队通常会编写自动化测试套件来防止回归。这些测试通常是在编写应用程序功能代码之后编写的。我们将采用另一种方法&#xff1a;在实现应用程序代码之前编写测试。这称为测试驱动开发 (TDD)。 为什么要应用 TDD&#xff1f;通过在实…...

学习随记:word2vec的distance程序源码注释、输入输出文件格式说明

word2vec中有5个程序&#xff0c;其中demo-word.sh中涉及两个&#xff1a;word2vec、distance。考虑到distance比较简单&#xff0c;所以我从这个入手&#xff0c;希望通过简单代码理解如何在一个高维数据空间计算距离&#xff08;查找&#xff09;。一维数据的查找&#xff0c…...

CSS 之 position 定位属性详解

CSS系列文章目录 CSS 之 display 布局属性详解 CSS 之 position 定位属性详解一文搞懂flex布局 【弹性盒布局】 文章目录 CSS系列文章目录一、前言二、静态定位&#xff1a;position:static&#xff1b;二、相对定位&#xff1a;position:relative三、绝对定位&#xff1a;pos…...

初学STM32 --- USMART

目录 USMART简介 USMART主要特点&#xff1a; USMART原理 USMART组成&#xff1a; USMART 的实现流程简单概括 USMART扫描函数&#xff1a; USMART系统命令 USMART移植 USMART简介 USMART是一个串口调试组件&#xff0c;可以大大提高代码调试效率&#xff01; USMART主…...

MySQL叶子节点为啥使用双向链表?不使用单向呢?

文章内容收录到个人网站&#xff0c;方便阅读&#xff1a;http://hardyfish.top/ 文章内容收录到个人网站&#xff0c;方便阅读&#xff1a;http://hardyfish.top/ 文章内容收录到个人网站&#xff0c;方便阅读&#xff1a;http://hardyfish.top/ MySQL 中的 B 树索引&#x…...

4_TypeScript 条件语句 --[深入浅出 TypeScript 测试]

在 TypeScript 中&#xff0c;条件语句用于根据不同的条件执行不同的代码块。这些语句包括 if 语句、else if 语句、else 语句和 switch 语句。通过使用条件语句&#xff0c;你可以编写出能够根据特定逻辑分支的代码&#xff0c;从而实现更加动态和灵活的功能。 1. if 语句 i…...

vue elementUI Plus实现拖拽流程图,不引入插件,纯手写实现。

vue elementUI Plus实现拖拽流程图&#xff0c;不引入插件&#xff0c;纯手写实现。 1.设计思路&#xff1a;2.设计细节3.详细代码实现 1.设计思路&#xff1a; 左侧button列表是要拖拽的组件。中间是拖拽后的流程图。右侧是拖拽后的数据列表。 我们拖动左侧组件放入中间的流…...

图漾相机基础操作

1.客户端概述 1.1 简介 PercipioViewer是图漾基于Percipio Camport SDK开发的一款看图软件&#xff0c;可实时预览相机输出的深度图、彩色图、IR红外图和点云图,并保存对应数据&#xff0c;还支持查看设备基础信息&#xff0c;在线修改gain、曝光等各种调节相机成像的参数功能…...