百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

不想用Object和Array存储数据,你还有Set和Map

toyiye 2024-07-26 22:02 7 浏览 0 评论

全文共4271字,预计学习时长11分钟



许多年来,程序员们一直使用Object和Array来存储数据,这种趋势不仅仅局限于JavaScript。除了这两个选项外,没有其他选择来存储多个值和处理数据结构。然而,在使用Object和Array时有几个限制,例如:


· Array可以存储重复的元素。

· 没有像Array那样找到Object长度的方法。

· 只有字符串可以存储在Object中,不记插入顺序。

· 开发人员必须根据用例选择数组或对象。

· 像Lodash这样的第三方库被用来增强数组的功能。


随着2015年ES6的发布,情况开始好转。ES6引入了对Map和Set的支持,旨在克服上述限制。


什么是Set和Map?


如前所述,这两个功能都是在JavaScript的ES6版本中引入的。Set是唯一元素的有序集合。“唯一元素”是最重要的,因为它意味着一个Set中不能存储重复的元素。但是它没有键-值对系统。


Map是Array和Object数据结构的组合。它像Object一样是键-值对的Set,但它也记住插入格式,并具有length(.size)属性。


· Set的声明和初始化:一个集合可以像这样初始化。


const set = new Set();


· 从Set中添加和删除元素:你可以使用.add()方法轻松地将元素插入到集合中。


const set = new Set();set.add('John');set.add('Martha')set.add('Bryan');set.add('John');//set = {'John','Martha','Bryan'}


JavaScript中的Set借用了很多数学集合的属性,并且只包含唯一的元素。删除元素也非常简单,使用.delete()方法删除单个元素,或使用.clear()方法删除所有元素。


set.add('John');set.add('Martha')set.add('Bryan');set.delete('Martha')//set= {'John','Bryan'}set.clear(); // removes all the element


· Set的大小:使用.size,你可以很容易地找到有用的Set的大小。


set.add('a')set.add('b');set.add('c');console.log(set.size) // => 3


· 访问Set中的元素:Set在尝试记录或访问其值时的方式不同。你可以记录数组并查看元素,但这不适用于Set。


var arr=[1,2,3];const set = new Set(arr);console.log(set) // => [objectSet]console.log(arr) // => (3) [1,2,3]


为了访问Set,我们需要一个SetIterator()来获取所有的值。JavaScript提供了一个属性.values()来获取一个迭代器,然后我们可以将该迭代器与循环结合使用获取所有的值。如以下代码片段演示:


var arr=[1,2,3];const set = new Set(arr);variterator=set.values()console.log(iterator.next().value) //1


检索所有元素更简单的方法是使用.forEach(),如下所示:


var arr=[1,2,3];const set = new Set(arr);set.forEach(v=>console.log(v))


输出:


1
2
3


此外,你可以使用.has()方法检查是否存在某个值,如果找到该元素,该方法将返回true。


var arr=[1,2,3];const set = new Set(arr);console.log(set.has(1)); // true


值得一提的是,尽管Set不支持键-值对元素,但keys()和entries()等方法对Set是可用的。


Set vs Array


Set和Array倾向于执行和处理相同的操作,但存在一些差异。最大的区别是Set不能像Array那样有重复项,而Set提供了一种更简单的方法来删除项。此外,Set的元素在插入顺序上是可迭代的。


与数学集合一样,JavaScript中的集合也可以用于执行union和intersection等操作,这些操作可以在合并数据或在两个Set中寻找公共元素时使用。


初始化和声明Map


与Set类似,Map也可以用同样的方式声明。


const map = new Map();


从Map中添加和删除元素:Map支持类似Object的键值对。因此,在增加价值的同时,我们也需要提供一个密钥。这和我们在Set中看到的不一样。


const map = new Map();map.set('Name', 'iPhone'); // map.set(key,value)formatmap.set('Brand', 'Apple');map.set('Price', '$1000');


要从Map中删除一个值,我们可以简单地将键传递给.delete()属性。


const map = new Map();map.set('Name', 'iPhone'); map.set('Brand','Apple');map.set('Price', '$1000');map.delete('Price'); //removes the elementwith key 'Price'


与Set类似,可以使用.clear()删除所有元素。


map.clear() // removes all the element


Map的大小:使用.size可以很容易地检索Map的大小(长度)。


const map = new Map();map.set('Name', 'iPhone');map.set('Brand','Apple');map.set('Price', '$1000');console.log(map.size)//=> 3


访问Map中的元素:Map为我们提供了一个.get()方法,通过将键作为参数传递到方法中来快速获取值。


const map = new Map();map.set('Name', 'iPhone');map.set('Brand','Apple');map.set('Price', '$1000');console.log(map.get('Name'));//iPhoneconsole.log(map.get('Brand')); // Apple


但是如果你只想要键、值,或者键和值都想要,该怎么办呢?Map有.keys(),.values()和.entries()分别实现相同的功能。使用上面代码中的相同Map:


console.log(map.keys());
// iterator {'Name','Brand',Price'}console.log(map.values());
// iterator {'iPhone','Apple','$1000'}console.log(map.entries());
//iterator {'Name':'iPhone','Brand':'Apple',Price':'$1000'}


Map的迭代也非常简单:


//with for-each
map.forEach((value, key) => {
   console.log(`${key} is ${value} yearsold!`);
});


// with for-of
for(const [key, value] of map) {
  console.log(`${key} : ${value}`);
}


此外,你可以使用.has()属性并传递键轻松地检查元素是否存在。


var map = new Map();
map.set('age',19);console.log(map.has('age')) // true since 'age' key ispresent


如果你决定将object转换为map,JavaScript已经搞定了。我们之前使用.entries()来获取所有键-值对,但这次我们将使用针对Object的方法。


const myObject= {
  'Age': '25',
  'Gender': 'Male',
  'Nationality': 'Australian'
};


const myMap = new Map(Object.entries(myObject)); //object to mapconstanotherObject = Object.fromEntries(myMap) // map to object


你可以轻松地将map转换为object,如上所示。要将Map转换为Array,可以使用array .from(myMap)。


Map vs Array &Objects


Map似乎解决了Array和Object的许多缺点,比如它能够处理更复杂的操作。Map就像是Array和Object的混合体。它有一个类似array的size属性,可以以键-值对格式存储元素。除此之外,它还提供了.has()之类的方法来检查元素是否存在,这可以节省大量时间。


而且,它不要求键必须是字符串类型。你甚至可以使用一个对象作为键来帮助你编写更好的代码。


虽然Array和Object已经成为存储集合和键-值对元素的事实上的标准,但通过引入Map和Set,你可以为代码提供一种有趣的方法。Set和Map是JavaScript提供的用于存储复杂数据结构的新标准。


此外,使用这些数据结构还消除了使用第三方库(如Lodash)的需要,因为这些新的数据结构默认提供了.has()和.delete()等方法。



Array和Object在任何意义上都不是过时的,不过使用Set和Map肯定是处理数据更好的方法,尤其是在构建大型复杂应用程序时。


留言点赞关注

我们一起分享AI学习与发展的干货

如转载,请后台留言,遵守转载规范

相关推荐

「编程」Java GUI 基础(java编程语言基础)

图形化学习是外功,内功外功配合才能所向披靡。一、JFrameJAVASWING导入包importjavax.swing.*导入包importjava.awt.*JFrameframe=new...

这六个Java技术当年是多么风光,而现在又有几个人用过

嗨,雷猴啊,今天我给大家分享下我的开发历程中,我知道的那些被淘汰的技术或者框架。不知道你们都知道吗?也不知道你们都有没有用过,但是它们之前都是风靡一时,让我们再来了解一次吧。偷偷告诉大家有些我甚至都没...

开发第一个Swing程序(开发第一个java程序实验报告)

packagecom.web.www;importjavax.swing.*;/**第一个Swing程序*/publicclassSwing1extendsJFrame{publicSw...

Java课程设计项目实例《远程屏幕分享监视》第2部分

Java课程设计项目实例《远程屏幕分享监视》第2部分1、服务器端ScreenMonitoringServer程序类及相关的功能方法的编程实现(1)创建出服务器端的ScreenMonitoringSer...

新手学Java编程语言怎么入门?知识点都帮你整理好了

新手学Java编程语言怎么入门?下面和千锋广州小编一起来看看吧!掌握语言基础是第一步,了解Java基础知识,Java关键字、核心概念或者基本编码技术。掌握操作符、控制执行流程、访问权限控制、复用类、多...

Java Swing组件“HelloWorld”程序演示实例

Java源代码:/*首先导入Swing需要的包*/importjavax.swing.*;importjavax.swing.UIManager;importjava.awt.*;import...

新年Java小游戏之「年兽大作战」祝您笑口常开

这个游戏加上编写文章,上班摸鱼时间加上回家的空闲时间,大概花了三天多。java写这玩应真的很痛苦,各种状态位,各种图片和逻辑判断,脑袋都快炸了。而且肯定没有前端的精致,效果一般,偶尔会有卡顿,各位就图...

10分钟掌握 JMeter接口测试的基础入门

嘿。大家好,我是4U:...

JMeter 的简单安装说明(jmeter安装配置)

最近在做一组性能测试,接触到了JMeter这个测试工具,在这里记录一下JMeter的介绍以及简单安装过程。JMeter简介...

Jmeter压测实例分享——新手儿也能一学就会!

JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试领域。它可以用于测试静态和动态资源,例如静态文件、Java...

过年必备Java动态烟花教程如何用Canvas和Timer实现炫酷烟花动画

烟花是一种常见的庆祝活动和节日的方式,它们在夜空中绽放出各种颜色和形状,给人们带来美丽和欢乐。你是否想过用Java编程来模拟烟花的效果呢?如果你对此感兴趣,那么这篇教程就是为你准备的。在这篇教程中,你...

全程软件测试(九十五):Jmeter技能基础—读书笔记

jmeter是一款优秀的开源性能测试工具,目前最新版本3.0版本,官网文档地址:http://jmeter.apache.org/usermanual/index.html一、优点...

原创 JAVA Swing JFrame窗口的建立

importjava.awt.*;importjavax.swing.*;publicclassExample1extendsJFrame{//定义一个类继承JFrame类public...

Java Swing组件下的JComboBox组件实例

运行成功的界面:java源代码:一定要注意:执行环境(JRE)javaSE-1.8/*首先导入JButtontest所需要的包*/importjavax.swing.*;importjavax.s...

Java引包的几种方法(java 引用)

第一种方法可以在Superclass这里输入javax.swing.JFrame进行引包也可以在类体外面输入importjavax.swing.JFrame;进行引包还可以点击JFrame然后点击I...

取消回复欢迎 发表评论:

请填写验证码