类似于数组,但又跟数组不一样,数组里面可以有重复的值,Set里面不能有重复值
let arr = ['a','b','c','a']; console.log(arr); // ["a", "b", "c", "a"] let set = new Set(['a','b','c','a']); console.log(set); // Set(3) {"a", "b", "c"}创建数组的两种方式,一字面量,二构造函数
创建Set的方式,使用构造函数
new Set(['a','b'])接受一个数组参数
let set = new Set(['a','b','c']); console.log(set); // Set(3) {"a", "b", "c"} // 例一 const set = new Set([1, 2, 3, 4, 4]); [...set] // [1, 2, 3, 4] // 例二 const items = new Set([1, 2, 3, 4, 5, 5, 5, 5]); items.size // 5往set里面添加内容
let set = new Set(); set.add('a'); set.add('b'); console.log(set); // Set(2) {"a", "b"}和length很像就是一个属性,不是方法
set.size; // 1原型里有 Symbol(Symbol.iterator) 方法就可以迭代,可以使用for of
let set = new Set(['a','b','c']); for(var item of set){ // 默认就是values console.log(item); } // a // b // c我们都知道数组是有下标的,但是set好像也有,set的下标获取的好像就是值
遍历key
let set = new Set(['a','b','c']); for(var item of set.keys()){ console.log(item); } // a // b // c遍历值
let set = new Set(['a','b','c']); for(var item of set.values()){ console.log(item); } // a // b // c遍历每一项
let set = new Set(['a','b','c']); for(var item of set.entries()){ console.log(item); } // ["a", "a"] // ["b", "b"] // ["c", "c"] // 也可以直接解构 for(var [key,value] of set.entries()){ console.log(key,value); }如果是我,我还是喜欢forEach遍历
let set = new Set(['a','b','c']); set.forEach((value,index) => { console.log(value,index); }) // a a // b b // c c因为add返回自己
let set = new Set(); set.add('a').add('b').add('c');因为只有转为数组后,才能使用数组身上set不具有的一些方法,比如map
let arr = [...new Set()];set 的用处
let arr = [1,3,5,1,2,6,3,1,5,2]; let newArr = [...new Set(arr)]; console.log(newArr); // [1, 3, 5, 2, 6]还可以字符串去重
let str = 'wuwei'; let newStr = [...new Set(str)].join('') 向 Set 加入值的时候,不会发生类型转换,所以5和"5"是两个不同的值。Set 内部判断两个值是否不同,使用的算法叫做“Same-value equality”,它类似于精确相等运算符(===),主要的区别是NaN等于自身,而精确相等运算符认为NaN不等于自身。注意:两个对象总是不相等的。比如我想让set中的1,2,3,变为2,4,6
使用set自己的for…of…循环
let set = new Set([1,2,3]); let newSet = new Set(); for(let item of set){ newSet.add(item*2); } console.log(newSet); // {2, 4, 6}使用map方法
let set = new Set([1, 2, 3]) let newSet = [...set].map( (item, index, set) => item * 2 ) console.log(new Set(newSet))使用filter过滤
let set = new Set([1,2,3,4,5,6,7,8]); set = new Set([...set].filter(val=>val%2==0)) console.log(set); //Set(4) {2, 4, 6, 8}我们都知道数组里面可以放对象,其实set也可以
let set = new Set(); let json = { a: 1, b: 2 } set.add(json); console.log(set); // Set(1) {{…}}类似于json,但是json的键key只能是字符串
map的key可以是任意类型
map的使用
为了解决这个问题,ES6 提供了 Map 数据结构。它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。也就是说,Object 结构提供了“字符串—值”的对应,Map 结构提供了“值—值”的对应,是一种更完善的 Hash 结构实现。如果你需要“键值对”的数据结构,Map 比 Object 更合适。
用json作为key
let map = new Map(); let json = { a:1, b:2 } // json作为key值 map.set(json,'wuwei'); // Map(1) {{…} => "wuwei"} // json作为value值 map.set('a',json); // Map(1) {"a" => {…}}map.delete();
删除成功返回true,删除失败返回false
map.delete(json); // 删除一项返回布尔值,有则为true,没有则为false
map.has(json);循环和set一样
for(let [key,value] of map.entries()){ console.log(key,value) } for(let key of map.keys()){} for(let value of map.values()){}