ES6 的Set与Map 对象

一、Set对象

         Set是ES6新增的数据结构,她类似有数组的形式,Set对象是值的集合,并且Set的元素只会出现一次,不会重复。

基本用法

        let obj={a:1}
let tmp
=[2,1] let arr=[1,2,4,2,5,1,4,obj,tmp] const set=new Set(arr);// 类数组 console.log(set) //set [1,2,4,5,{a:1},[2,1]] console.log(set.size) // set对象的值的个数 // has 方法 console.log(set.has(2)) //true console.log(set.has({a:1})) //false console.log(set.has(obj)) // true // add(value) 方法 在Set对象尾部添加一个元素。返回该Set对象。 console.log(set.add("hello")) //set [1,2,4,5,{a:1},[2,1],'hello']
       
        // delete(value) 方法 移除Set的中与这个值相等的元素
        console.log(set.delete(2)) //true
        console.log(set.delete([2,1])) //false
        console.log(set.delete(tmp))  //true

        // clear 移除Set对象内的所有元素。
         console.log(set.clear())

// 该对象包含Set对象中的按插入顺序排列的所有元素的值的[value, value]数组
console.log(set.entries())
      
      // 输出set对象所有的值
      for (let item of set) console.log(item);
      

 为什么明明是两种表达方法的值都是{a:1},一个是false 一个为true???

 我的理解是 

       对于[1,2,4,2,5,1,4,{a:1}]中的{a:1}和set.has({a:1})中的{a:1},从内存的角度上看,它们不是共享同一个内存地址,而是指向两个不同的地址,即便值时一样的,本质上是指向两个不同的对象。因此我用一个obj变量来保存{a:1},然后在数组中和has()也是用obj的变量来表示,来达到他们是指向同一个对象的效果。假如理解有误,请各位指教一二。

 set转化为Array

      let obj={a:1}
        let tmp=[2,1]
        let arr=[1,2,4,2,5,1,4,obj,tmp]
        const set=new Set(arr);// 类数组
        // 第一种方法
        console.log(Array.from(set))
        //第二种方法
        console.log([...set])
        

 二、Map对象

         一个Map对象在迭代时会根据对象中元素的插入顺序来进行 — 一个  for...of 循环在每次迭代后会返回一个形式为[key,value]的数组

基本用法

    let map=new Map();
    console.log(map)
    
//set(key,value)  添加键
    let keyObj={a:1}
    let keyFun=function(){}
    map.set('key1','helloWord')
    map.set(keyObj,'keyObj关联的值')
    map.set(keyFun, "和键keyFun关联的值");
console.log(map.size) //3 console.log(map)
    // get(key) 读取值,返回键对应的值
    console.log(map.get('key1')) //'helloWord'
    console.log(map.get(keyObj)) //'keyObj关联的值
    console.log(map.get(keyFun)) //"和键keyFun关联的值"
    console.log(map.get({a:1}))  //undefined,由于keyObj !== {a:1}
    
    // delete(key) 
    console.log(map.delete(keyFun)) //true

    // has(key)
    console.log(map.has(keyObj)) //true

// 获取键值
  
console.log(map.keys())
   
    console.log(map.values())
  
    // 迭代出map
for (let [key, value] of map.entries()) {
console.log(key + " = " + value);
}

Map对象转化为数组

    // Map与数组
    let arr=[['0','hello'],['one','function'],['0','hello'],['two','fff']];
    
    let deMap=new Map(arr)
    console.log(deMap)
    // 只取得Map的键,进而转化为数组
    console.log(Array.from(deMap.keys())); //['0','one','two']
    
    // Map对象转化为数组,实现了arr数组去重
    //方式一
    console.log(Array.from(deMap)) //[['0','hello'],['one','function'],['two','fff']]
    // 方式二
    console.log([...deMap])  //[['0','hello'],['one','function'],['two','fff']]

Map对象复制或合并 

Map对象间可以进行合并,但是会保持键的唯一性。

    let first = new Map([
        [1, 'one'],
        [2, 'two'],
        [3, 'three'],
        ]);

    let second = new Map([
    [1, 'uno'],
    [2, 'dos']
    ]);

    // 合并两个Map对象时,如果有重复的键值,则后面的会覆盖前面的。
    // 展开运算符本质上是将Map对象转换成数组。
    let merged = new Map([...first, ...second]);
    console.log(merged)

     

 注:Map与Set对象对于数组或者对象去除重复项都有帮助

posted @ 2020-06-11 00:03  JeanJY  阅读(262)  评论(0编辑  收藏  举报