JavaScript中集合常用操作方法详解

JavaScript中集合常用操作方法详解

JavaScript中的集合主要包括数组(Array)、集合(Set)和映射(Map)。下面我将详细介绍这些集合类型的常用操作方法。

数组(Array)

数组是JavaScript中最常用的集合类型,提供了丰富的操作方法。

创建数组

// 字面量创建
const arr1 = [1, 2, 3, 4, 5];// 构造函数创建
const arr2 = new Array(1, 2, 3, 4, 5);// 创建指定长度的空数组
const arr3 = new Array(5); // 创建长度为5的空数组// Array.from方法从类数组对象或可迭代对象创建数组
const arr4 = Array.from('hello'); // ['h', 'e', 'l', 'l', 'o']// Array.of方法创建包含所有参数的数组
const arr5 = Array.of(1, 2, 3); // [1, 2, 3]

添加和删除元素

const arr = [1, 2, 3];// 末尾添加元素
arr.push(4, 5);  // 返回新长度 5,arr变为[1, 2, 3, 4, 5]// 开头添加元素
arr.unshift(0);  // 返回新长度 6,arr变为[0, 1, 2, 3, 4, 5]// 末尾删除元素
const last = arr.pop();  // 返回删除的元素 5,arr变为[0, 1, 2, 3, 4]// 开头删除元素
const first = arr.shift();  // 返回删除的元素 0,arr变为[1, 2, 3, 4]// 任意位置添加/删除元素
// splice(起始索引, 删除数量, 添加的元素...)
arr.splice(1, 1, 'a', 'b');  // 返回删除的元素数组 [2],arr变为[1, 'a', 'b', 3, 4]

查找元素

const arr = [1, 2, 3, 4, 5, 3];// indexOf查找元素首次出现的索引
const index1 = arr.indexOf(3);  // 2// lastIndexOf查找元素最后一次出现的索引
const index2 = arr.lastIndexOf(3);  // 5// includes检查数组是否包含某元素
const hasThree = arr.includes(3);  // true// find返回第一个满足条件的元素
const found = arr.find(item => item > 3);  // 4// findIndex返回第一个满足条件的元素的索引
const foundIndex = arr.findIndex(item => item > 3);  // 3// findLast返回最后一个满足条件的元素(ES2023)
const foundLast = arr.findLast(item => item < 4);  // 3// findLastIndex返回最后一个满足条件的元素的索引(ES2023)
const foundLastIndex = arr.findLastIndex(item => item < 4);  // 5

遍历数组

const arr = [1, 2, 3, 4, 5];// forEach遍历数组
arr.forEach((item, index) => {console.log(`索引${index}: ${item}`);
});// map创建一个新数组,其结果是对原数组每个元素调用函数处理后的值
const doubled = arr.map(item => item * 2);  // [2, 4, 6, 8, 10]// filter创建一个新数组,包含通过所提供函数测试的所有元素
const evens = arr.filter(item => item % 2 === 0);  // [2, 4]// reduce对数组中的每个元素执行一个reducer函数,将其结果汇总为单个返回值
const sum = arr.reduce((acc, curr) => acc + curr, 0);  // 15// reduceRight从右到左应用reduce
const rightSum = arr.reduceRight((acc, curr) => acc + curr, 0);  // 15// some检查是否至少有一个元素通过了测试
const hasEven = arr.some(item => item % 2 === 0);  // true// every检查是否所有元素都通过了测试
const allEven = arr.every(item => item % 2 === 0);  // false

排序和反转

const arr = [3, 1, 4, 1, 5, 9];// sort对数组元素进行排序(默认按字符串顺序)
arr.sort();  // [1, 1, 3, 4, 5, 9]// 自定义排序
arr.sort((a, b) => b - a);  // [9, 5, 4, 3, 1, 1] 降序// reverse反转数组
arr.reverse();  // [1, 1, 3, 4, 5, 9]

数组转换和复制

const arr = [1, 2, 3, 4, 5];// join将数组元素连接成字符串
const str = arr.join('-');  // "1-2-3-4-5"// slice返回数组的一部分,不修改原数组
const sliced = arr.slice(1, 4);  // [2, 3, 4]// concat合并两个或多个数组
const combined = arr.concat([6, 7], [8, 9]);  // [1, 2, 3, 4, 5, 6, 7, 8, 9]// 展开运算符复制数组
const copy = [...arr];  // [1, 2, 3, 4, 5]// flat将嵌套数组扁平化
const nested = [1, [2, [3, 4]]];
const flattened = nested.flat(2);  // [1, 2, 3, 4]// flatMap先映射再扁平化
const flatMapped = arr.flatMap(x => [x, x * 2]);  // [1, 2, 2, 4, 3, 6, 4, 8, 5, 10]

集合(Set)

Set是一种存储唯一值的集合类型。

基本操作

// 创建Set
const set = new Set([1, 2, 3, 3, 4]);  // {1, 2, 3, 4}// 添加元素
set.add(5);  // 返回Set本身,set变为{1, 2, 3, 4, 5}// 检查元素是否存在
const hasThree = set.has(3);  // true// 删除元素
set.delete(3);  // 返回true表示删除成功,set变为{1, 2, 4, 5}// 获取元素数量
const size = set.size;  // 4// 清空Set
set.clear();  // set变为{}

遍历Set

const set = new Set([1, 2, 3, 4, 5]);// forEach遍历
set.forEach(value => {console.log(value);
});// 使用for...of遍历
for (const value of set) {console.log(value);
}// 转换为数组
const arr = [...set];  // [1, 2, 3, 4, 5]// 获取迭代器
const values = set.values();  // SetIterator {1, 2, 3, 4, 5}
const entries = set.entries();  // SetIterator {[1, 1], [2, 2], [3, 3], [4, 4], [5, 5]}

Set集合操作

const setA = new Set([1, 2, 3, 4]);
const setB = new Set([3, 4, 5, 6]);// 并集
const union = new Set([...setA, ...setB]);  // {1, 2, 3, 4, 5, 6}// 交集
const intersection = new Set([...setA].filter(x => setB.has(x)));  // {3, 4}// 差集
const difference = new Set([...setA].filter(x => !setB.has(x)));  // {1, 2}

映射(Map)

Map是一种键值对集合,可以使用任何类型作为键。

基本操作

// 创建Map
const map = new Map([['key1', 'value1'],['key2', 'value2']
]);// 添加或更新键值对
map.set('key3', 'value3');  // 返回Map本身// 获取值
const value = map.get('key1');  // "value1"// 检查键是否存在
const hasKey = map.has('key2');  // true// 删除键值对
map.delete('key2');  // 返回true表示删除成功// 获取键值对数量
const size = map.size;  // 2// 清空Map
map.clear();  // map变为空Map

遍历Map

const map = new Map([['name', '张三'],['age', 30],['job', '工程师']
]);// forEach遍历
map.forEach((value, key) => {console.log(`${key}: ${value}`);
});// 使用for...of遍历
for (const [key, value] of map) {console.log(`${key}: ${value}`);
}// 获取所有键
const keys = [...map.keys()];  // ["name", "age", "job"]// 获取所有值
const values = [...map.values()];  // ["张三", 30, "工程师"]// 获取所有键值对
const entries = [...map.entries()];  // [["name", "张三"], ["age", 30], ["job", "工程师"]]

Map与对象转换

// 对象转Map
const obj = { name: '张三', age: 30 };
const mapFromObj = new Map(Object.entries(obj));  // Map(2) {"name" => "张三", "age" => 30}// Map转对象
const map = new Map([['name', '张三'],['age', 30]
]);
const objFromMap = Object.fromEntries(map);  // {name: "张三", age: 30}

WeakMap和WeakSet

WeakMap和WeakSet是特殊的集合类型,它们持有对对象的弱引用,不会阻止垃圾回收。

// WeakMap示例
const weakMap = new WeakMap();
let obj = { id: 1 };
weakMap.set(obj, 'metadata');// WeakSet示例
const weakSet = new WeakSet();
let obj2 = { id: 2 };
weakSet.add(obj2);

实用技巧

数组去重

// 使用Set去重
const array = [1, 2, 2, 3, 4, 4, 5];
const uniqueArray = [...new Set(array)];  // [1, 2, 3, 4, 5]

数组交集

const arr1 = [1, 2, 3, 4];
const arr2 = [3, 4, 5, 6];
const intersection = arr1.filter(item => arr2.includes(item));  // [3, 4]

数组分组(ES2023)

const people = [{ name: '张三', age: 25 },{ name: '李四', age: 30 },{ name: '王五', age: 25 }
];// 按年龄分组
const groupedByAge = Object.groupBy(people, person => person.age);
/*
{"25": [{ name: '张三', age: 25 }, { name: '王五', age: 25 }],"30": [{ name: '李四', age: 30 }]
}
*/

对象转Map的应用场景

// 频率计数
const array = ['apple', 'banana', 'apple', 'orange', 'banana', 'apple'];
const frequencyMap = array.reduce((map, item) => {map.set(item, (map.get(item) || 0) + 1);return map;
}, new Map());// 结果: Map(3) {"apple" => 3, "banana" => 2, "orange" => 1}

以上就是JavaScript中集合常用操作方法的详细介绍。这些方法能够帮助你高效地处理数据集合,实现各种复杂的数据操作需求。

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

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

相关文章

【HC-05】蓝牙串口通信模块调试与应用(1)

一、HC-05 基础学习视频 HC-05蓝牙串口通信模块调试与应用1 二、HC-05学习视频课件

【学Rust写CAD】18 定点数2D仿射变换矩阵结构体(MatrixFixedPoint结构别名)

源码 // matrix/fixed.rs use crate::fixed::Fixed; use super::generic::Matrix;/// 定点数矩阵类型别名 pub type MatrixFixedPoint Matrix<Fixed, Fixed, Fixed, Fixed, Fixed, Fixed>;代码解析 这段代码定义了一个定点数矩阵的类型别名 MatrixFixedPoint&#xff…

axios文件下载使用后端传递的名称

java后端通过HttpServletResponse 返回文件流 在Content-Disposition中插入文件名 一定要设置Access-Control-Expose-Headers&#xff0c;代表跨域该Content-Disposition返回Header可读&#xff0c;如果没有&#xff0c;前端是取不到Content-Disposition的&#xff0c;可以在统…

HarmonyOS之深入解析如何根据url下载pdf文件并且在本地显示和预览

一、文件下载 ① 网络请求配置 下载在线文件&#xff0c;需要访问网络&#xff0c;因此需要在 config.json 中添加网络权限&#xff1a; {"module": {"requestPermissions": [{"name": "ohos.permission.INTERNET","reason&qu…

鸿蒙前后端项目源码-点餐v3.0-原创!原创!原创!

鸿蒙前后端点餐项目源码含文档ArkTS语言. 原创作品.我半个月写的原创作品&#xff0c;请尊重原创。 原创作品&#xff0c;盗版必究&#xff01;&#xff01;&#xff01;&#xff01; 原创作品&#xff0c;盗版必究&#xff01;&#xff01;&#xff01;&#xff01; 原创作…

VUE3+TypeScript项目,使用html2Canvas+jspdf生成PDF并实现--分页--页眉--页尾

使用html2CanvasJsPDF生成pdf&#xff0c;并实现分页添加页眉页尾 1.封装方法htmlToPdfPage.ts /**path: src/utils/htmlToPdfPage.tsname: 导出页面为PDF格式 并添加页眉页尾 **/ /*** 封装思路* 1.将页面根据A4大小分隔边距&#xff0c;避免内容被中间截断* 所有元素层级不要…

5.Excel:从网上获取数据

一 用 Excel 数据选项卡获取数据的方法 连接。 二 要求获取实时数据 每1分钟自动更新数据。 A股市场_同花顺行情中心_同花顺财经网 用上面方法将数据加载进工作表中。 在表格内任意区域右键&#xff0c;刷新。 自动刷新&#xff1a; 三 缺点 Excel 只能爬取网页上表格类型的…

《深度剖析SQL之WHERE子句:数据过滤的艺术》

在当今数据驱动的时代&#xff0c;数据处理和分析能力已成为职场中至关重要的技能。SQL作为一种强大的结构化查询语言&#xff0c;在数据管理和分析领域占据着核心地位。而WHERE子句&#xff0c;作为SQL中用于数据过滤的关键组件&#xff0c;就像是一把精准的手术刀&#xff0c…

华为eNSP-配置静态路由与静态路由备份

一、静态路由介绍 静态路由是指用户或网络管理员手工配置的路由信息。当网络拓扑结构或者链路状态发生改变时&#xff0c;需要网络管理人员手工修改静态路由信息。相比于动态路由协议&#xff0c;静态路由无需频繁地交换各自的路由表&#xff0c;配置简单&#xff0c;比较适合…

Docker 快速入门指南

Docker 快速入门指南 1. Docker 常用指令 Docker 是一个轻量级的容器化平台&#xff0c;可以帮助开发者快速构建、测试和部署应用程序。以下是一些常用的 Docker 命令。 1.1 镜像管理 # 搜索镜像 docker search <image_name># 拉取镜像 docker pull <image_name>…

基础认证-单选题(一)

单选题 1、下列关于request方法和requestlnStream方法说法错误的是(C) A 都支持取消订阅响应事件 B 都支持订阅HTTP响应头事件 C 都支持HttpResponse返回值类型 D 都支持传入URL地址和相关配置项 2、如需修改Text组件文本的透明度可通过以下哪个属性方法进行修改 (C) A dec…

Logback使用和常用配置

Logback 是 Spring Boot 默认集成的日志框架&#xff0c;相比 Log4j&#xff0c;它性能更高、配置更灵活&#xff0c;并且天然支持 Spring Profile 多环境配置。以下是详细配置步骤及常用配置示例。 一、添加依赖&#xff08;非 Spring Boot 项目&#xff09; 若项目未使用 Sp…

MySQL基础语法DDLDML

目录 #1.创建和删除数据库 ​#2.如果有lyt就删除,没有则创建一个新的lyt #3.切换到lyt数据库下 #4.创建数据表并设置列及其属性,name是关键词要用name包围 ​编辑 #5.删除数据表 #5.查看创建的student表 #6.向student表中添加数据,数据要与列名一一对应 #7.查询studen…

在windows下安装windows+Ubuntu16.04双系统(下)

这篇文章的内容主要来源于这篇文章&#xff0c;为正式安装windowsUbuntu16.04双系统部分。在正式安装前&#xff0c;若还没有进行前期准备工作&#xff08;1.分区2.制作启动u盘&#xff09;&#xff0c;见《在windows下安装windowsUbuntu16.04双系统(上)》 二、正式安装Ubuntu …

Ubuntu24.04 离线安装 MySQL8.0.41

一、环境准备 1.1 官方下载MySQL8.0.41 完整包 1.2 上传包 & 解压 上传包名称是&#xff1a;mysql-server_8.0.41-1ubuntu24.04_amd64.deb-bundle.tar # 切换到上传目录 cd /home/MySQL8 # 解压&#xff1a; tar -xvf mysql-server_8.0.41-1ubuntu24.04_amd64.deb-bundl…

记录一次Dell服务器更换内存条报错解决过程No memory found

文章目录 问题问题分析解决流程总结 问题 今天给服务器添加了几个内存条&#xff0c;开启后报错 No memory found No useable DlMMs found. Verify the DlMMsare properly seated and that they are installed in the correct sockets. 问题分析 这个错误说明服务器在启动时没…

Apache HttpClient使用

一、Apache HttpClient 基础版 HttpClients 是 Apache HttpClient 库中的一个工具类&#xff0c;用于创建和管理 HTTP 客户端实例。Apache HttpClient 是一个强大的 Java HTTP 客户端库&#xff0c;用于发送 HTTP 请求并处理 HTTP 响应。HttpClients 提供了多种方法来创建和配…

Maven版本统一管理

多模块的项目&#xff0c;怎么方便管理 模块的版本号呢&#xff1f; 可以使用 ${revision} 配合 flatten-maven-plugin插件 <plugin><groupId>org.codehaus.mojo</groupId><artifactId>flatten-maven-plugin</artifactId><version>1.1.0&…

时序数据库 InfluxDB(一)

时序数据库 InfluxDB&#xff08;一&#xff09; 数据库种类有很多&#xff0c;比如传统的关系型数据库 RDBMS&#xff08; 如 MySQL &#xff09;&#xff0c;NoSQL 数据库&#xff08; 如 MongoDB &#xff09;&#xff0c;Key-Value 类型&#xff08; 如 redis &#xff09…

E5071C数据保存教程:SNP文件/CSV导出+远程传输步骤一键收藏

Keysight E5071C 网络分析仪支持多种数据存储方式&#xff0c;以下是详细的操作步骤和注意事项&#xff1a; 1. 内部存储&#xff08;仪器内存&#xff09; 保存测量数据&#xff1a; 轨迹数据&#xff1a;按 Save/Recall → Save Trace Data → 选择存储格式&#xff08;如 …