从0开始学习JavaScript--JavaScript中的集合类

JavaScript中的集合类是处理数据的关键,涵盖了数组、Set、Map等多种数据结构。本文将深入研究这些集合类的创建、操作,以及实际应用场景,并通过丰富的示例代码,帮助大家更全面地了解和应用这些概念。

数组(Array)基础

数组是JavaScript中最基本且常用的集合类型,掌握数组的创建、索引访问、迭代等基本操作对于处理列表数据至关重要。

// 示例:数组基础操作
let fruits = ['Apple', 'Banana', 'Orange'];console.log(fruits[0]); // 输出:Apple
console.log(fruits.length); // 输出:3fruits.forEach(fruit => {console.log(fruit);
});
// 输出:
// Apple
// Banana
// Orange

在这个例子中,创建了一个水果数组,并演示了数组的基础操作,包括索引访问和使用forEach进行迭代。

Set(集合)的使用

ES6引入的Set是一种不重复元素的集合,适用于需要唯一值的场景。

// 示例:Set的使用
let uniqueNumbers = new Set([1, 2, 3, 1, 2]);console.log(uniqueNumbers); // 输出:Set { 1, 2, 3 }
console.log(uniqueNumbers.size); // 输出:3uniqueNumbers.add(4);
console.log(uniqueNumbers); // 输出:Set { 1, 2, 3, 4 }

在这个例子中,使用Set来创建一个不重复的数字集合,并演示了添加新元素的操作。

Map(映射)的应用

Map是一种键值对的集合,提供了更灵活的数据组织方式。

// 示例:Map的应用
let userMap = new Map();userMap.set('name', 'Alice');
userMap.set('age', 30);console.log(userMap.get('name')); // 输出:Alice
console.log(userMap.has('gender')); // 输出:false

在这个例子中,使用Map来存储用户信息,并演示了通过键获取值、检查键是否存在的操作。

数组与集合类的转换

在实际应用中,数组和集合类之间的转换是常见需求,了解如何进行转换能够提高数据处理的灵活性。

// 示例:数组与集合类的转换
let arrayFromSet = Array.from(uniqueNumbers);
console.log(arrayFromSet); // 输出:[1, 2, 3, 4]let setFromArray = new Set(fruits);
console.log(setFromArray); // 输出:Set { 'Apple', 'Banana', 'Orange' }

在这个例子中,演示了通过Array.from将Set转换为数组,以及通过Set构造函数将数组转换为Set。

实际应用场景

在实际应用场景中,集合类发挥着重要的作用,为开发者提供了丰富的工具来解决各种数据处理问题。以下是一些常见的实际应用场景:

1. 数据去重

在从后端获取数据或用户输入数据时,往往需要保证数据的唯一性。使用Set类是一种非常高效的去重方法。

let rawData = [1, 2, 3, 1, 2, 4, 5, 6];
let uniqueData = new Set(rawData);
console.log([...uniqueData]); // 输出:[1, 2, 3, 4, 5, 6]

在这个例子中,使用Set快速地对原始数据进行了去重,确保了数据的唯一性。

2. 数据统计

Map类在数据统计方面非常有用,特别是在需要记录某个元素出现的次数或其他相关信息时。

let data = [1, 2, 3, 1, 2, 4, 5, 6];
let dataCount = new Map();data.forEach(item => {dataCount.set(item, dataCount.get(item) + 1 || 1);
});console.log(dataCount);
// 输出:
// Map { 1 => 2, 2 => 2, 3 => 1, 4 => 1, 5 => 1, 6 => 1 }

在这个例子中,使用Map记录了每个元素出现的次数,为数据的统计提供了有力支持。

3. 数据映射

有时候需要对一组数据进行映射,将某些属性提取出来或进行特定的处理。Map类提供了一种灵活的方式来实现数据映射。

let userData = [{ id: 1, name: 'Alice' },{ id: 2, name: 'Bob' },{ id: 3, name: 'Charlie' }
];let userIdMap = new Map(userData.map(user => [user.id, user.name]));console.log(userIdMap.get(2)); // 输出:Bob

在这个例子中,通过Map将用户数据映射为id和name的对应关系,便于快速查找。

4. 数据缓存

在一些需要频繁查询的场景中,使用集合类来缓存数据能够提高查询效率,避免重复计算。

function fibonacci(n, memo = new Map()) {if (n <= 2) return 1;if (memo.has(n)) return memo.get(n);const result = fibonacci(n - 1, memo) + fibonacci(n - 2, memo);memo.set(n, result);return result;
}console.log(fibonacci(5)); // 输出:5

在这个例子中,使用Map来缓存已经计算过的斐波那契数,避免重复计算,提高性能。

遍历与迭代集合

遍历集合是集合类的常见操作,JavaScript提供了多种方式进行遍历。

// 示例:遍历与迭代集合
let iterableSet = new Set(['apple', 'banana', 'orange']);for (let fruit of iterableSet) {console.log(fruit);
}
// 输出:
// apple
// banana
// orangelet iterableMap = new Map([['name', 'Alice'], ['age', 30]]);for (let [key, value] of iterableMap) {console.log(`${key}: ${value}`);
}
// 输出:
// name: Alice
// age: 30

在这个例子中,演示了使用for...of语法遍历Set和Map的方式,以及如何同时遍历Map的键和值。

集合操作与过滤

集合类提供了丰富的操作方法,包括合并、交集、差集等,这些方法在处理数据时非常有用。

// 示例:集合操作与过滤
let set1 = new Set([1, 2, 3]);
let set2 = new Set([2, 3, 4]);let unionSet = new Set([...set1, ...set2]);
console.log(unionSet); // 输出:Set { 1, 2, 3, 4 }let intersectionSet = new Set([...set1].filter(x => set2.has(x)));
console.log(intersectionSet); // 输出:Set { 2, 3 }let differenceSet = new Set([...set1].filter(x => !set2.has(x)));
console.log(differenceSet); // 输出:Set { 1 }

在这个例子中,演示了合并两个Set、获取两个Set的交集、获取两个Set的差集等操作。

集合类的性能考虑

在处理大规模数据时,集合类的性能成为关键问题,了解不同集合操作的时间复杂度是优化代码的一部分。

// 示例:集合类的性能考虑
let largeSet = new Set([...Array(10000).keys()]);console.time('hasOperation');
console.log(largeSet.has(9999)); // 输出:true
console.timeEnd('hasOperation'); // 输出:hasOperation: 0.057ms

在这个例子中,通过console.timeconsole.timeEnd测量了has操作的执行时间。

总结

通过深入学习JavaScript中的集合类,能够更灵活地处理各种数据结构,尤其是在大规模数据的场景下。了解集合的创建、遍历、操作、性能考虑等方面的知识,有助于优化代码、提高程序性能。希望本文提供的详细示例代码和解释,能够帮助大家更全面地掌握JavaScript中集合类的知识,从而更自信地处理实际的数据处理任务。

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

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

相关文章

SystemVerilog学习 (11)——覆盖率

目录 一、概述 二、覆盖率的种类 1、概述 2、分类 三、代码覆盖率 四、功能覆盖率 五、从功能描述到覆盖率 一、概述 “验证如果没有量化&#xff0c;那么就意味着没有尽头。” 伴随着复杂SoC系统的验证难度系数成倍增加&#xff0c;无论是定向测试还是随机测试&#xff…

安全框架springSecurity+Jwt+Vue-1(vue环境搭建、动态路由、动态标签页)

一、安装vue环境&#xff0c;并新建Vue项目 ①&#xff1a;安装node.js 官网(https://nodejs.org/zh-cn/) 2.安装完成之后检查下版本信息&#xff1a; ②&#xff1a;创建vue项目 1.接下来&#xff0c;我们安装vue的环境 # 安装淘宝npm npm install -g cnpm --registryhttps:/…

软件测试/测试开发/人工智能丨基于Spark的分布式造数工具:加速大规模测试数据构建

随着软件开发规模的扩大&#xff0c;测试数据的构建变得越来越复杂&#xff0c;传统的造数方法难以应对大规模数据需求。本文将介绍如何使用Apache Spark构建分布式造数工具&#xff0c;以提升测试数据构建的效率和规模。 为什么选择Spark&#xff1f; 分布式计算&#xff1a;…

easyExcel注解详情

前言11个注解字段注解 类注解基础综合示例补充颜色总结 11个注解 ExcelProperty ColumnWith 列宽 ContentFontStyle 文本字体样式 ContentLoopMerge 文本合并 ContentRowHeight 文本行高度 ContentStyle 文本样式 HeadFontStyle 标题字体样式 HeadRowHeight 标题高度 HeadStyle…

Python将原始数据集和标注文件进行数据增强(随机仿射变换),并生成随机仿射变换的数据集和标注文件

Python将原始数据集和标注文件进行数据增强&#xff08;随机仿射变换&#xff09;&#xff0c;并生成随机仿射变换的数据集和标注文件 前言前提条件相关介绍实验环境生成随机仿射变换的数据集和标注文件代码实现输出结果 前言 由于本人水平有限&#xff0c;难免出现错漏&#x…

OpenCV快速入门:图像滤波与边缘检测

文章目录 前言一、噪声种类与生成1.1 椒盐噪声1.2 高斯噪声1.3 彩色噪声 二、卷积操作2.1 卷积基本原理2.2 卷积操作代码实现 三、线性滤波3.1 均值滤波均值滤波原理均值滤波公式均值滤波代码实现 3.2 方框滤波方框滤波原理方框滤波公式方框滤波代码实现 3.3 高斯滤波高斯滤波原…

redis非关系型数据库(缓存型数据库)——中间件

【重点】redis为什么这么快&#xff1f;&#xff08;应届&#xff09; ①redis是纯内存结构&#xff0c;避免磁盘I/O的耗时 ②redis核心模块是一个单进程&#xff0c;减少线程切换和回收线程资源时间 ③redis采用的是I/O的多路复用机制&#xff08;每一个执行线路可以同时完…

npm install 下载不下来依赖解决方案

背景 最近在构建 前端自动化部署 的方案中发现了一个问题&#xff0c;就是我在npm install的时候&#xff0c;有时候成功&#xff0c;有时候不成功&#xff0c;而且什么代码也没发生更改&#xff0c;报错也就是那么几个错&#xff0c;所以在此也整理了一下遇到这种情况&#xf…

如何使用 WPF 应用程序连接 FastReport报表

随着期待已久的FastReport WPF的发布&#xff0c;您不再需要使用 FastReport .NET 来处理基于 WPF 的项目。 不久前&#xff0c;在 FastReport .NET 中使用 WPF 还相当不方便。并非一切都进展顺利&#xff1b;连接 FastReport.dll 和许多其他问题存在问题。我们重新思考了该方…

2023年中职“网络安全“—Web 渗透测试①

2023年中职"网络安全"—Web 渗透测试① Web 渗透测试任务环境说明&#xff1a;1.访问地址http://靶机IP/task1&#xff0c;分析页面内容&#xff0c;获取flag值&#xff0c;Flag格式为flag{xxx}&#xff1b;2.访问地址http://靶机IP/task2&#xff0c;访问登录页面。…

面试题c/c++--语言基础

一 、语言基础 1.1 指针 野指针&#xff1a;指针指向的位置是不可知的 悬空指针&#xff1a;指针最初指向的内存已经被释放了的一种指针 两种指针都指向无效内存空间&#xff0c; 即不安全不可控 。需要在定义指针后且在使用之前完成初始化或者使用 智能指针来避免 智能指针 智…

获取阿里云Docker镜像加速器

1、阿里云官网&#xff08;www.aliyun.com&#xff09;注册账号 2、打开“控制台首页” 控制台首页地址&#xff1a;https://home.console.aliyun.com/home/dashboard/ProductAndService 3、点击“概览->容器镜像服务 ACR” 4、打开“镜像工具->镜像加速器”页面&#x…

【grafana | clickhouse】实现展示多折线图

说明&#xff1a; 采用的是 Visualizations 的 Time series&#xff0c;使用的 clickhouse 数据源 在工作中遇到了一个需求&#xff0c;写好了代码&#xff0c;需要在grafana上展示在一个项目中所有人的&#xff0c;随时间的代码提交量变化图 目前遇到的问题&#xff1a;展示…

FFmpeg常用命令行讲解及实战一

文章目录 前言一、学习资料参考二、FFmpeg 选项1、主要选项①、主要命令选项②、举例 2、视频选项①、主要命令选项②、举例1&#xff09;提取固定帧2&#xff09;禁止输出视频3&#xff09;指定视频的纵横比 3、音频选项①、主要命令选项②、举例 4、字幕选项①、主要命令选项…

负载均衡简介

负载均衡 负载均衡&#xff08;Load Balance&#xff0c;简称 LB&#xff09;是高并发、高可用系统必不可少的关键组件&#xff0c;目标是 尽力将网络流量平均分发到多个服务器上&#xff0c;以提高系统整体的响应速度和可用性。 负载均衡的分类和OSI模型息息相关&#xff0c…

【CHI】Ordering保序

本节介绍CHI协议所包含的支持系统保序需求的机制&#xff0c;包括&#xff1a; • Multi-copy atomicity • Completion response and ordering • Completion acknowledgment • Transaction ordering 一、 Multi-copy atomicity CHI协议中所使用的memory model要求为mu…

【面试经典150 | 数学】Pow(x, n)

文章目录 写在前面Tag题目来源题目解读解题思路方法一&#xff1a;快速幂-递归方法二&#xff1a;快速幂-迭代 其他语言python3 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主…

王者荣耀游戏

游戏运行如下&#xff1a; sxt Background package sxt;import java.awt.*; //背景类 public class Background extends GameObject{public Background(GameFrame gameFrame) {super(gameFrame);}Image bg Toolkit.getDefaultToolkit().getImage("C:\\Users\\24465\\D…

5分钟教你轻松搭建Web自动化测试框架

在程序员的世界中&#xff0c;一切重复性的工作&#xff0c;都应该通过程序自动执行。「自动化测试」就是一个最好的例子。 随着互联网应用开发周期越来越短&#xff0c;迭代速度越来越快&#xff0c;只会点点点&#xff0c;不懂开发的手工测试&#xff0c;已经无法满足如今的…

3.8-镜像的发布

如果我们想将image push到docker hub里面&#xff0c;那么我们的image的名字一定要是这种格式&#xff1a;docker hub id/imageName&#xff0c;例如&#xff1a;lvdapiaoliang/hello-docker docker hub个人账户设置地址&#xff1a; 在push之前要先登录&#xff1a; docker l…