c++ map插入key值相同的数据_不想用Object和Array存储数据,你还有Set和Map

news/2024/6/29 2:50:05

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

8cc4f672eb6f2122bea4ee0d8eeb7749.png
图源:unsplash

许多年来,程序员们一直使用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()等方法。

5916104acbd8cfb677f0f6dc8e0d006b.png
图源:unsplash

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

05e04080e125aac435932d6030ebe250.png

留言点赞关注

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

编译组:符馨元、张月星

相关链接:https://medium.com/javascript-in-plain-english/stop-using-objects-and-arrays-to-store-data-289c3edaaa33

如转载,请私信小芯,遵守转载规范


http://www.niftyadmin.cn/n/1999912.html

相关文章

34 败走麦城

34 败走麦城 这是一个侠义英雄的结束。建安二十四年,关羽被杀,刘备集团不但痛失一员猛将,还永远地失去了荆州。那么,一个曾经威震华夏的虎将,为什么会一败涂地?在刘备方面,谁该为关羽的死负责呢…

关于指针传入函数

关于指针,有个经典的互换函数,来解释形参和实参。http://blog.csdn.net/jingzi123456789/article/details/51374807 。 任何东西,传入函数,其实在函数内部,就生成了一份拷贝。普通变量如此,指针也是如此。之…

mysql5.7 双向主从_docker mysql5.7主从复制搭建(双主双从)

1.1 简单说明这里用了两台服务器,分别是161,和163,有条件可以用四台161服务器 :1主1备(mysql-5.7-master-161 mysql-5.7-slave-161)端口:3339 和3340163服务器 :1主1备(mysql-5.7-master-163 mysql-5.7-slave-163)端口&#xff…

mysql4迁移5_(mysql)从digikam 4. *迁移到5. *时的数据库迁移难度

由于我的旧数据库中存在一些不一致,我遇到了同样的问题.修复后(主要是删除一些死引用)进行升级.我似乎还有另一个问题,但可能与db无关.这将显示您的问题(除了根标签外都应为空):select * from Images where album not in (select Albums.id from Albums);select id,…

35 夷陵之战

35 夷陵之战 刘备占据荆州,却最终被孙权夺了回去,还搭上了左膀右臂——关羽的一条性命。这对于正打算大展鸿图的刘备,无疑是沉重打击。不肯善罢甘休的刘备随后发动了意在夺回荆州的夷陵之战,那么刘备究竟是如何指挥这场战争的呢&…

三维视觉国际会议首度在中国举办

3DV——International Conference on 3 Dimensional Vision(三维视觉国际会议),自2013年成立以来,逐渐成为计算机视觉和图形学的三维研究领域中的重量级会议,每年都有来着世界各地的专家学者到会进行交流。去年&#x…

常用mysql引擎及工作原理_了解MySQL存储引擎工作原理

MySql数据库最大的特色就是其插件式的存储引擎架构,本文主要介绍MySql常用的存储引擎,为开发时选择合适的存储引擎提供参考。1. MySql体系结构#在介绍存储引擎之前先来介绍下MySql的体系结构,以便大家知道存储引擎在MySql整个体系中处于什么位…

postman提取返回值_postman 上一个接口的返回值作为下一个接口的入参

在使用postman做接口测试的时候,在多个接口的测试中,如果需要上一个接口的返回值作为下一个接口的入参,其基本思路是:1、获取上一个接口的返回值2、将返回值设置成环境变量或者全局变量3、设置下一个接口的参数形式列子&#xff1…