es6新出的数据容器技术-Map和Set

本文深入探讨了ES6中新增的数据容器技术Map和Set。Map提供了有序的键值对存储,其键可以是任意类型,与Object相比具有明显优势。Set用于存储唯一值,处理特殊值如+0/-0, NaN和undefined时有独特规则。此外,文章还介绍了Map和Set之间的转换操作,以及如何将它们与数组相互转换。" 85925632,8256644,Android获取联系人信息及拨打电话,"['移动开发', 'Android', '数据库']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Map

1、Map 对象保存键值对。任何值(对象或者原始值) 都可以作为一个键或一个值。

  • Map和Object的区别

- 一个 Object 的键只能是字符串或者 Symbols,但一个 Map 的键可以是任意值。
- Map 中的键值是有序的(FIFO 原则),而添加到对象中的键则不是。
- Map 的键值对个数可以从 size 属性获取,而 Object 的键值对个数只能手动计算。
- Object 都有自己的原型,原型链上的键名有可能和你自己在对象上的设置的键名产生冲突。

  • 没有创建的语法糖
    var a=["key"]
    			var m1=new Map([["age",100],[20,"hello"],[a,90]])

  •  取数据
    var re1=m1.get("age")
    			var re2=m1.get(20)
    			var re3=m1.get(["key"])
    			var re4=m1.get(a)
    			console.log(re1,re2,re3,re4)

  •  存数据
    m1.set("life",1)
    			m1.set("age",1)
    			console.log(m1)
    		 console.log(m1.size)//m1.size,查看有多少个数据

  • 删除数据
    m1.delete(20)
    			var re5=m1.delete("age")
    			var re6=m1.delete("age")
    		 console.log(m1,re5,re6)
     
  • 清空数据 
    m1.clear()
    			console.log(m1)

2、购物车案例

 

	var mycar = {
				data: new Map(),
				clear:function(){
					this.data.clear()
				},
				jianshao:function(id){
					let obj=this.data.get(id)
					if(obj){
						obj.count--
						if(obj.count<=0){
							this.data.delete(id)
						}
					}
				},
				add: function(id) {
					let obj = this.data.get(id)
					if (obj) {
						// console.log(obj)
						obj.count++
						this.data.set(id, obj)
					}
				},
				total: function() {
					var result = 0;
					this.data.forEach(function(el) {
						console.log(el)
						result += el.count * el.price
					})
					return result
				},
				network: function() {
					var jiashuju = [{
						id: 435123,
						title: "鱼香肉丝",
						price: 18,
						count: 1
					}, {
						id: 435124,
						title: "东坡肉",
						price: 28,
						count: 1
					}, {
						id: 435125,
						title: "米饭",
						price: 2,
						count: 2
					}];
					// this.data.set(jiashuju[0].id,jiashuju[0])
					// this.data.set(jiashuju[1].id,jiashuju[1])
					// this.data.set(jiashuju[2].id,jiashuju[2])
					var self = this
					jiashuju.map(function(el) {
						self.data.set(el.id, el)
					})
				}
			}
			mycar.network()
			mycar.add(435123)
			mycar.add(435125)
			mycar.add(435125)
			mycar.add(435125)
			mycar.add(435125)
			mycar.add(435125)
			mycar.jianshao(435124)
			console.log(mycar.data)
			var re1 = mycar.total()
			console.log(re1)
			mycar.clear()
			console.log(mycar.data)

二、Set

 Set 对象允许你存储任何类型的唯一值,无论是原始值或者是对象引用。

Set中的特殊值

Set 对象存储的值总是唯一的,所以需要判断两个值是否恒等。有几个特殊值需要特殊对待:

+0 与 -0 在存储判断唯一性的时候是恒等的,所以不重复;undefined 与 undefined 是恒等的,所以不重复;
NaN 与 NaN 是不恒等的,但是在 Set 中只能存一个,不重复

  •  创建
    var arr=[11,22,33,11]
    			var s1=new Set(arr)//遍历的数组 然后把数组的元素们调用s1.add添加进集合中
    			var arr2=Array.from(s1)//取出了数据容器中的所有数据 然后存入新数组返回值
    			console.log(arr2)
    

  • 并集
    var arr = [10, 20, 30, 10,{}]
    			var arr2 = [100, 200,30,10]
    			var s1 = new Set([...arr,...arr2])
    			console.log(s1)
     
  • 交集
    var arr = [10, 20, 30, 10,{}]
    			var arr2 = [100, 200,30,10]
    			var s2 = new Set(arr.filter(function(el) {
    				if (arr2.includes(el)) {
    					return el
    				}
    			}))
    			console.log(s2)
     
  • 差集 
var a = new Set([1, 2, 3]);
var b = new Set([4, 3, 2]);
var difference = new Set([...a].filter(x => !b.has(x))); // {1}

三、08-arr-map-set的转换

  1. 数组转map:必须是二维数组

      var arr=[[1,"hello"],[2,"h5"],[3,{name:"karen"}]]
    
                var m1=new Map(arr)
    
                

    2、map转数组: Array.from()静态方法 

         var arr2=Array.from(m1)
    
                console.log(arr,m1,arr2,arr==arr2,arr[2][1]==arr2[2][1])
    
                var arr=[100,200,100,{age:20},{age:20}]

    3、数组转集合

                var s1=new Set(arr)
    
           console.log(s1,s1.size)

    4、集合转数组

              

      var arr2=Array.from(s1)
    
                console.log(arr,s1,arr2,arr[4]==arr2[3])
    
                

       

      5、多个数组转集合和map:用 ...

         var arr1=[10,20]
    
                var arr2=[100,20]
    
                var arr3=[200,{name:"karen"}]
    
                var s1=new Set([...arr1,...arr2,arr3])
    
                var m1=new Map([arr1,arr2,arr3])
    
                var m2=new Map(m1)
    
                console.log(m1,m2,m1==m2,m1.get(200)==m2.get(200))
    
                var mySet=new Set(" hel  lo 监控死\n")
    
                console.log(mySet);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值