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

news2024/11/16 12:00:35

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

数组(Array)基础

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

// 示例:数组基础操作
let fruits = ['Apple', 'Banana', 'Orange'];

console.log(fruits[0]); // 输出:Apple
console.log(fruits.length); // 输出:3

fruits.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); // 输出:3

uniqueNumbers.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
// orange

let 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.coloradmin.cn/o/1235695.html

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

相关文章

【Java】NIO概述

本文主要介绍Java的IO。 这里主要按类的操作方式和操作对象对JavaIO进行分类&#xff0c;方便理解&#xff0c;后续使用时可以方便地查询。 一、操作方式分类 首先介绍几组概念&#xff1a; 字节流和字符流&#xff1a; 字节流&#xff1a;以字节为单位&#xff0c;每次次读…

【高级网络程序设计】Week2-3 HTML

一、The Basics 1. HTML&HTML file HTMLMarkup languageHyper Text Markup LanguageHTML fileText file with markup tags.htm/.html extension Create an html file Open an editor Type: <html><head><titile><body> Save it as .html Open i…

计算机网络——网络可靠性及网络出口配置

1. 前言&#xff1a; 学习目标&#xff1a; 1.了解链路聚合的作用 2. 了解ACL的工作原理 3. 了解NAT的工作原理和配置 2. 网络可靠性方案 网络可靠性是指网络在面对各种异常情况或故障时&#xff0c;能够维持正常运行和提供服务的能力。这包括防止网络中断、减小数据丢失的可能…

vue3中使用全局自定义指令和组件自定义指令

这篇文章会教大家如何实现全局自定义指令和组件自定义指令 &#x1f4d3;全局自定义指令和组件自定义指令的区别&#xff0c;除了写法不同和作用不同&#xff0c;其他的包括生命周期的使用方法都是一致的&#xff0c;全局自定义指令在main.ts中注册后整个项目都可以使用&#x…

dvwa-command injection 代码审计(超详细逐行审计)

dvwa-command injection 代码审计 low <?phpif( isset( $_POST[ Submit ] ) ) {// Get input$target $_REQUEST[ ip ];// Determine OS and execute the ping command.if( stristr( php_uname( s ), Windows NT ) ) {// Windows$cmd shell_exec( ping . $target );}…

Parallel Diffusion Models of Operator and Image for Blind Inverse Problems

盲逆问题算子和图像的并行扩散模型 论文链接&#xff1a;https://arxiv.org/abs/2211.10656 项目链接&#xff1a;https://github.com/BlindDPS/blind-dps Abstract 在正向算子已知的情况下(即非盲)&#xff0c;基于扩散模型的逆问题求解器已经展示了最先进的性能。然而&…

linux md5sum计算hash指令

在soc启动&#xff0c;验证镜像签名时&#xff0c;会计算文件的hash值&#xff0c;确保文件未被修改&#xff0c;md5sum可以计算&#xff0c;有256,512位的的其他指令&#xff0c; 如下&#xff0c;计算文件hash值。

@PostConstruct虽好,请勿乱用

1.问题说明 在日常的业务开发中&#xff0c;有时会利用PostConstruct在容器启动时执行一些任务。例如&#xff1a; PostConstruct public void init(){System.out.println("service 初始化..............."); }一般情况这没什么问题&#xff0c;但最近一个同事在做…

Android加固为何重要?很多人不学

为什么要加固&#xff1f; APP加固是对APP代码逻辑的一种保护。原理是将应用文件进行某种形式的转换&#xff0c;包括不限于隐藏&#xff0c;混淆&#xff0c;加密等操作&#xff0c;进一步保护软件的利益不受损坏。总结主要有以下三方面预期效果&#xff1a; 1.防篡改&#x…

django restful framework序列化与反序列化

在前后端分离开发中&#xff0c;对于RESTfulAPI设置&#xff0c;一般需要将查询/更新数据以JSON方式进行返回。 序列化 Model.py from django.db import models class User(models.Model):username models.CharField(verbose_name用户名,max_length10)age models.IntegerF…

RT-Thread JSN-SR04T

JSN-SR0T4-2.0 超声波测距模块可提供 20cm-600cm 的非接触式距离感测功能&#xff0c;测距精度可达高到 2mm&#xff1b;模块包括收发一体的超声波传感器与控制电路组成。产品采用工业级一体化超声波探头设计&#xff0c;防水型&#xff0c;性能稳定&#xff0c;谦容市场上所有…

手搓js轮播图_JavaScript进阶

手搓js轮播图 逻辑解析html结构图片切换方法圆点导航切换效果左右箭头点击切换圆点导航点击切换自动播放&#xff0c;介入暂停 完整代码 逻辑解析 css的样式我就不再进行讲述&#xff0c;如果有需求可以评论区告诉我&#xff0c;我再出一篇文章进行详细讲解 js轮播图最主要的核…

java算法学习索引之字符串问题

一 判断两个字符串是否互为变形词 【题目】给定两个字符串str1和str2&#xff0c;如果str1和str2中出现的字符种类一样且每种字符出现的次数也一样&#xff0c;那么str1与str2互为变形词。请实现函数判断两个字符串是否互为变形词。 public boolean isDeformation(String str1…

SPSS快速聚类

前言&#xff1a; 本专栏参考教材为《SPSS22.0从入门到精通》&#xff0c;由于软件版本原因&#xff0c;部分内容有所改变&#xff0c;为适应软件版本的变化&#xff0c;特此创作此专栏便于大家学习。本专栏使用软件为&#xff1a;SPSS25.0 本专栏所有的数据文件请点击此链接下…

React结合antd5实现整个表格编辑

通过react hooks 结合antd的table实现整个表格新增编辑。 引入组件依赖 import React, { useState } from react; import { Table, InputNumber, Button, Space, Input } from antd;定义数据 const originData [{ key: 1, name: 白银会员, value: 0, equity: 0, reward: 0…

全球首款容器计算产品重磅发布,激活上云用云新范式

云布道师 10 月 31 日&#xff0c;杭州云栖大会上&#xff0c;阿里云云原生应用平台负责人丁宇宣布&#xff0c;阿里云容器计算服务 ACS 正式发布&#xff01;ACS 将大幅降低企业和开发者用云门槛&#xff0c;真正将 Serverless 理念大规模落地。 容器计算服务 ACS&#xff0c…

零代码编程:用ChatGPT将SRT字幕文件批量转为Word文本文档

一个文件夹中有多个srt视频字幕文件&#xff0c;srt文件里面有很多时间轴&#xff1a; 现在想将其批量转为word文档&#xff0c;去掉里面与字符无关的时间轴&#xff0c;在ChatGPT中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;要完成一个批量将SRT字幕文件转为…

jbase仪器接口设计

jbase的计划有借助虚拟M来实现连仪器&#xff0c;之前陆续写了些TCP逻辑&#xff0c;今天终于整理完成了仪器设计。首先用java的cs程序测试TCP的服务和客户端。 javafx的示例加强 package sample;import javafx.application.Application; import javafx.event.EventHandler; …

如何给shopify motion主题的产品系列添加description

一、Description是什么 Description是一种HTML标签类型&#xff0c;通过指定Description的内容&#xff0c;可以帮助搜索引擎以及用户更好的理解当前网页包含的主要了内容。 二、Description有什么作用 1、基本作用&#xff0c;对于网站和网页做一个简单的说明。 2、吸引点击&…

部署单仓库多目录项目

部署单仓库多目录项目 文章目录 部署单仓库多目录项目1.部署单仓库多目录项目2.Shell脚本进行部署单仓库多目录项目2.1 编写Shell脚本2.2 Demo推送代码及测试 3.小结 1.部署单仓库多目录项目 #部署单仓库多目录项目 在开发过程中,研发团队往往会将一个大型项目拆分成几个子目录…