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

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中集合类的知识,从而更自信地处理实际的数据处理任务。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

grafana面板介绍

grafana 快速使用 背景 随着公司业务的不断发展&#xff0c;紧接来的是业务种类的增加、服务器数量的增长、网络环境的越发复杂以及发布更加频繁&#xff0c;从而不可避免地带来了线上事故的增多&#xff0c;因此需要对服务器到应用的全方位监控&#xff0c;提前预警&#xf…

在回调之间共享数据

可以在 App 中为 UI 组件编写回调函数&#xff0c;以指定用户与其交互时的行为方式。 在具有多个相互依赖的 UI 组件的 App 中&#xff0c;回调函数通常必须访问主 App 函数中定义的数据&#xff0c;或与其他回调函数共享数据。例如&#xff0c;如果创建一个具有列表框的 App&a…

vue3按需引入 vite-plugin-style-import 2.0版本报错(解决办法)

报错配置()&#xff1a;报错信息解决方法配置 报错配置()&#xff1a; //vite.config.js 部分代码 // 按需自动引入 elementplus 相关样式文件 import styleImport from vite-plugin-style-import// https://vitejs.dev/config/ export default defineConfig({plugins: [vue()…

leetcode:914. 卡牌分组(python3解法)

难度&#xff1a;简单 给定一副牌&#xff0c;每张牌上都写着一个整数。 此时&#xff0c;你需要选定一个数字 X&#xff0c;使我们可以将整副牌按下述规则分成 1 组或更多组&#xff1a; 每组都有 X 张牌。组内所有的牌上都写着相同的整数。 仅当你可选的 X > 2 时返回 tru…

flink 查看写入starrocks的数据量 总行数

针对该connector: https://github.com/StarRocks/docs.zh-cn/blob/main/loading/Flink-connector-starrocks.md

关于ASO优化的分步入门指南2

1、分析元数据。 分析我们收集的当前元数据和关键词&#xff0c;单独跟踪关键字词&#xff0c;然后跟踪组合。例如如果应用程序的标题是关于音乐的应用&#xff0c;则需要跟踪“音乐”、“听”、“听音乐”等关键词。填充元数据分析选项卡&#xff0c;使用搜索分数、下载影响和…

UEC++ day6

简易战斗系统 删除替换父类组件 现在需要添加剑的组件&#xff0c;但是一般来说附着到蒙皮骨骼的东西&#xff0c;也是蒙皮骨骼&#xff0c;所以我们可以新建一个类重新编写&#xff0c;也可以直接继承Interoperable类然后不管UStaticMeshComponent这个组件&#xff0c;新建U…

00后如何组织双十一大促看这一篇就够了! | 京东云技术团队

引言 大家好&#xff0c;我是王蒙恩&#xff0c;一名“整顿职场”的00后。作为一名去年刚刚加入京东的校招生&#xff0c;我有幸成为本次CDP平台的11.11备战负责人。虽然早在实习的时候就经历过大促&#xff0c;但是真正组织整个部门的备战还是很难忘的。于是提起笔&#xff0…

APP外包开发需要注意的问题

在进行APP外包开发时&#xff0c;有一些关键问题需要注意&#xff0c;以确保项目的顺利进行和最终交付满足预期的应用。以下是一些在APP外包开发中需要关注的问题&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎…

基于C#实现字符串相似度

一、概念 对于两个字符串 A 和 B&#xff0c;通过基本的增删改将字符串 A 改成 B&#xff0c;或者将 B 改成 A&#xff0c;在改变的过程中我们使用的最少步骤称之为“编辑距离”。比如如下的字符串&#xff1a;我们通过种种操作&#xff0c;痉挛之后编辑距离为 3&#xff0c;不…

虹科分享 | PEAK版本升级,看看有没有你关注的新功能?

号外号外&#xff01;近期PEAK进行了重要的版本升级&#xff0c;这次升级带来了许多令人兴奋的功能优化&#xff0c;助力您的工作流程更加便捷高效。为了帮助您更好地了解PEAK新版本&#xff0c;我们提供了详细的说明和指导&#xff0c;快来看看有没有你关注的新功能&#xff1…

如何为视频添加旁白,有哪些操作技巧?

简而言之&#xff0c;画外音是视频的旁白&#xff0c;在教程视频中添加旁白可以使视频更加有趣&#xff0c;并向观看者传达更多的信息。 如果您是视频制作人&#xff0c;想要为视频添加旁白&#xff0c;可阅读以下文章&#xff0c;可以帮助您更好地进行配音。 制作配音的技巧…

ubuntu20.04蓝牙连接airpods

ubuntu20.04蓝牙连接airpods 解禁蓝牙安装blueman设置模式连接上没有声音的问题 解禁蓝牙 sudo rmmod btusb sleep 1 sudo modprobe btusb sudo /etc/init.d/bluetooth restart安装blueman sudo apt install blueman sudo apt-get install pulseaudio-module-bluetooth sudo …

球幕投影有哪些常见的物理表现形式?

近年来&#xff0c;投影技术不断发展完善&#xff0c;给内容的表达方式带来了突破&#xff0c;使其展示形式不再局限于平面&#xff0c;即使在弧面、球面等异形幕墙上&#xff0c;也能呈现出令人惊叹的视觉画面。其中球幕投影备受关注&#xff0c;它以半球形屏幕将图像投影到球…

pytest

pytest test_one.py pytest的执行

十倍增量的海外客户开发新方式来了!外贸企业可直接照做

外贸和B2大C型&#xff08;汽车、房产、保险、教育等&#xff09;企业出海过程中&#xff0c;除了常见的数字营销&#xff08;投放&#xff09;、平台营销、活动营销&#xff08;线下展会&#xff09;和内容营销&#xff0c;还有一个批量化可快速复制起量的营销方式&#xff1a…

大厂秋招真题【单调栈】Bilibili2021秋招-大鱼吃小鱼

文章目录 题目描述与示例题目描述输入描述输出描述示例一输入输出说明 示例二输入输出说明 解题思路代码PythonJavaC时空复杂度 华为OD算法/大厂面试高频题算法练习冲刺训练 题目描述与示例 题目描述 小明最近喜欢上了俄罗斯套娃、大鱼吃小鱼这些大的包住小的类型的游戏。 于…

磁钢的居里温度和工作温度

你知道吗&#xff0c;磁体在超过一定温度时会永久的失磁&#xff0c;不同的磁体能够承受的最大工作温度是不同的&#xff0c;那么与温度相关的指标有哪些&#xff1f;如何根据工作温度来选择合适的磁钢&#xff1f;今天我们就来解答一下这些问题。 居里温度 说到温度与磁性关…

Python武器库开发-flask篇之error404(二十七)

flask篇之error404(二十七) 首先&#xff0c;我们先进入模板的界面创建一个404的html页面 cd templates vim 404.html404.html的内容如下&#xff1a; <h1>error!!!</h1>在 Flask 应用程序中&#xff0c;当用户访问一个不存在的页面的时候&#xff0c;会出现 4…

LeetCode【32】最长的有效括号

题目&#xff1a; 思路&#xff1a; 括号字符串依次入栈&#xff0c;删除匹配的成对括号。最后栈中留下的都是无法匹配的断点。这些断点的差值减一就是断点间有效括号串的长度&#xff0c;取这些长度的最大值即可。 例如括号字符串 “)()((())(”&#xff0c;最后留在栈中的…