Set与Map

104 阅读3分钟

Set

基本用法

ES6提供了新的数据结构-Set。类似与数组,但是成员的值都是唯一的。没有重复的。

const s = new Set();
s.add(1);
s.add(1);
console.log(s,size)//2
// 上面代码通过add方法 向Set结构加入成员 结果表示Set结构不会添加重复的值

向Set加入值时不会发生类型转换,所以 5 和 '5'是两个不同的值。Set内部判断两个值是否相同时使用的算法叫做"Same-value equality" 它类似与 精确相等运算符 '===' 主要的区别是能够识别 NaN 等于自身。 而精确运算符不认为NaN等于自身

Set实例的属性和方法

  • add() 添加某个值,返回Set结构本身。
  • delete() 删除某个值,返回一个布尔值。表示是否删除成功
  • has() 返回一个布尔值,表示参数是否为Set的成员。
  • clear() 清除所有成员 没有返回值
  • size 返回Set一共有几个成员
let set = new Set();
set.add(1);
set.add(3);
​
add.has(1); // true
add.delete(3);
add.has(3);//falseadd.size; //1
add.clear();
add.has(1);//false
​
​
// Arrary.from()  能够是 Set数据变成数组
let items= new Set([1,2,3,2,3]);
console.log(Array.from(items));//[1,2,3]  可以数组去重
console.log([...items]);// 也可以实现数组去重

遍历操作

Set结构有四种遍历的方法

  • keys() 返回键名的遍历器
  • values() 返回键值的遍历器
  • entries() 返回键值对的遍历器
  • forEach() 返回回调函数每个成员
        let set = new Set([1, 2, 3, 4]);
        // keys()
        for(var item of set.keys()){
          console.log(item);
            /*
            1
            2
            3
            4
            */
        }
        // values()  因为 Set结构中 键值与键名是一样的 所以 keys() 与 values()  遍历结果是一样的
        for(var item of set.values()){
          console.log(item);
        }
        // entries()
        for(var item of set.entries()){
          console.log(item);
        }
​

数组的map与 filter也能用于Set 只不过返回的结果是Set结构 Array.from() 可以使Set结构变成数组

Map

含义与基本含义

js的对象本质上是键值对的集合,但是只能用字符串作为键,这给它带来很大的限制。于是提供了Map数据结构

基本用法

  • set(key,value)设置key所对应的键值 然后返回整个Map结构
  • get(key)读取key对应的键值 如果不存在就返回 undefined
  • has(key) 返回一个布尔值,表示某个键是否在Map数据结构中
  • delete(key) 方法删除某个键 成功 返回true 反之 false
  • clear() 清除所有成员 没有返回值
  • size 返回Map的成员个数

遍历方法

  • keys() 返回键名的遍历器
  • values() 返回键值的遍历器
  • entries() 返回键值对的遍历器
  • forEach() 返回回调函数每个成员
        let map = new Map([
            ['user', 'wuhao'],
            ['age', 18]
        ]);
        //keys()
        for (let item of map.keys()){
          console.log(item);
        }
        //values()
        for (let item of map.values()){
          console.log(item);
        }
        //values()
        for (let item of map.entries()){
          console.log(item);
        }

与其他数据结构的互相转换

        let ma = new Map([['names','air'],['add','hz']]);
        // 转换为 数组
        console.log(Array.from(ma));
        console.log([...ma]);
       // 转化为对象
       let obj = {};
       for(let va of ma.keys()){
        obj[va] = ma.get(va)
       }
       console.log(obj);
       // 对象转换为 Map
       let map1 = new Map();
       for(let va  of Object.keys(obj)){
        map1.set(va,obj[va])
       }
       console.log('map',map1);

注意

只有对同一个对象引用,Map结构才将其视为同一个键。

        let ma = new Map([['names','air'],['add','hz']]);
        ma.set(['a'],11);
        console.log(ma.get(['a']));// undefined
  // 上面的set和get表面上是针对同一个键 实际却是两个值。内存地址是不一样的,因此get方法无法读取改建 返回undefined
 // Map的键实际是跟内存地址绑定的,只要内存不一样 就是为两个键。
 // 只要Map的键是一个简单类型的值 则只要两个值严格相等就将是为一个键 0 -0和 NaN都视为一个键