0
点赞
收藏
分享

微信扫一扫

set-Map

腊梅5朵 2022-04-17 阅读 83

set-Map

set

set是一个集合
松散型结构 元素存储 没有key 插入删除速度快 不能排序(无序的)
不能根据当前元素找到相邻的兄弟元素 元素具有唯一性 不能重复
var s = new Set([1,2,3,4,5]) // 括号内可以放数组 直接存进去
var s = new Set()
将元素加入到集合中
s.add(1);
s.add(2);
s.add(3);
s.add(2);
console.log(s) // {1, 2, 3}
删除元素
s.delete(2) //{1,3}
清空集合
s.clear(){size:0}

判断当前元素是否在集合中存在
console.log(s.has(2)) false
s.forEach(function(value){
	console.log(value)
})


size属性 与数组的length相似 是只读属性
cosnolog.log(s.size)  //3

set去重

var arr=[1,2,1,4,1,2,3,1,2,3,4,1,1,2];
// Array from() 将非数组列表转换为数组
// 去重
arr = Array.from(new Set(arr));
console.log(arr); // [1, 2, 4, 3]

for of 遍历迭代器 iterable

Array Set  NodeList  HTMLCollection  Arguments Map  Generator对象  FormData这些都是迭代器
var s = new Set();
s.add(1)
s.add(2)
s.add(3)
for(var value of s){
	console.log(s) // 1,2,3
}
var arr = [1,2,3]
数组也可以使用for of
for(var value of arr){
	cosnole.log(value) // 1,2,3
}
var arr = [1,2,2,3,4,5]
这是错误用法 数组不能这样用
for(var [index,value] of arr){
	console.log(index,value) // Set和Map.html:100 Uncaught TypeError: .for is not iterable
} 
var arr = [1,2,2,3,4,5]
arr.forEach(function(item,index){
	if(item%2===0) arr.splice(index,1)
})
console.log(arr) // [1,2,3,5] // 删不干净
var arr = [1,2,2,3,4,5]
var s = new Set(arr);
s.forEach(function(value){
	if(value%2===0) s.delete(value)
})
console.log(s) // [1,3,5] 用set 删除的时候 我们不需要考虑重新排序的问题 松散结构

案例

 <div>
     <button>按钮1</button>
     <button>按钮2</button>
     <button>按钮3</button>
 </div>
var s = new Set()
var div = document.querySelector('div')
div.addEventListener('click',clickHandler)
function clickHandler(e){
	if(e.target.nodeName !== 'BUTTON') return;
		s.add(e.target)
		if(s.size === 1){
			console.log('您点击了一个标点')
		}else if(s.size === 2){
			console.log('您点击了两个标签')
		}else{
			console.log('标签全部点击完成')
		}
}

Map

此Map非彼map 和数组的map不是一个东西 这个是Map类型
与对象object相似 object的key只能是字符串和symbol 不是字符串将自动隐士转换为字符串 没有长度
Map可以使用任何数据类型作为key存储任何值,有长度
var o ={a:1};
var o1 = {a :2}
var m =set Map();
m.set("a",1);
m.set(2,3);
m.set(true,false);
m.set(o,o1); // 存的是引用地址

console.log(m.get(true)) // false
console.log(m.get(o))  // o1
console.log(m.get(2))  // 3
获取存储的变量
console.log(m.size) // 4

判断是否有这个key
console.log(m.has(o)); // true

删除key  对应的value
m.delete(2)

清空map
m.clear();
console.log(m.keys()) // MapIterator {'a', 2, true, {…}}  所有key的迭代器
console.log(m.values())  // MapIterator {1, 3, false, {…}}  获取所有value的迭代器

遍历m

m.forEach(function(key,value){
	console.log(key,value)
})
打印结果如下

在这里插入图片描述


for(var [key,value] of m){
	console.log(key,value)   // set不可以使用
}
打印结果如下

在这里插入图片描述

遍历所有的keys迭代器
for( var key of m.keys()){
	console.log(key)
}
打印结果如下

在这里插入图片描述

遍历所有的value迭代器
for(var value of m.values()){
	cosnole.log(value)
}
打印结果如下

获取所有的迭代器
for (var [key,value] of m.entries()){
	console.log(key,value)
}
打印结果如下

在这里插入图片描述

对象和Map的转换和逆转换

entries

var obj ={ a:1,b:2 };
console.log(Object.entries(obj)); 

在这里插入图片描述

可以将对象转换为迭代器放入生成map
var obj = { a: 1, b: 2 };
var m = new Map(Object.entries(obj))
console.log(m) // {'a' => 1, 'b' => 2}

fromEntries

可以将迭代器转换为对象 比如可以将map转换为对象
var obj = { a: 1, b: 2 };
var o1 = Object.fromEntries(m)
console.log(o1)

在这里插入图片描述

数组
var o2 = Object.fromEntries([1,2,3]);
console.log(o2) // 报错

案例

<div>
	<button>按钮1</button>
	<button>按钮2</button>
	<button>按钮3</button>
	<button>按钮4</button>
	<button>按钮5</button>
</div>
	var btn = document.querySelector('button');
	var m = new Map();
	m.set(btn[0],btn[1])
	m.set(btn[1],btn[2])
	m.set(btn[2],btn[3])
	m.set(btn[3],btn[4])
	btn[0].addEventListener('click',clickHandler)
	function clickHandler(e){
		console.log(this.taxtContent);
		this.removeEventListener('click',clickHandler);
		if(m.has(this)){
			m.get(this).addEventListener('click',clickHandler);
		}
	}

Weakset WeakMap

用来对于内存管理进行设置的
WeakSet 弱引用集合
WeakMap 弱引用map
强引用和弱引用
对一个对象的强引用
var 0 = {a:1};
var o1 = o;
o = null;
o1 = null;
前面所学的所有引用赋值都是强引用 删除一个引用关系 另一个不会被删除
删除强引用 弱引用会自动被删除

强引用

强引用
var  o = {a:1};
var arr = [];
arr.push(o);
o = null;
console.log(arr)

在这里插入图片描述

弱引用

弱引用
var s = new WeakSet(); // 弱引用
s.add(o);
o=null;
// 当o设置为null s中就丢失了这个对象的引用地址,但是并不是即时的(刷新)
cosnole.log(s);

在这里插入图片描述

举报

相关推荐

set与map

set, map, bitset

map和set

初识Map,Set

Map和Set

Map与Set

0 条评论