Set和Map数据结构

一、Set:

  它本身是一个构造函数,用来生成Set数据结构。类似于数组的一种形式。

  特点:

    1、不会添加重复的值,例如:

var set = new Set([1,2,3,4,4,4,5]);
console.log([...set]);    // 1.2.3.4.5

    2、通过add(value),添加某个值;

       通过delete(value),删除某个值;

       通过has(value),判断该参数是否为Set的成员;

          通过clear(),清楚所有Set成员;

var set = new Set();
set.add("HJT");
set.add("TYY");
console.log([...set]);        // HJT TYY

set.delete("HJT");
console.log([...set]);        // TYY

set.has("HJT");               // flase
set.has("TYY");               // true

set.clear();
set.has("TYY");               // false

    

    3、遍历操作:keys():返回一个键名

          values():返回键值           

          entries():返回一个键值对            

          forEach():遍历每个成员

var set = new Set(['a','b','c','d','e','f']);
for(let x of set.keys()){
    console.log(x);   // a b c d e f
}
// 由于Set数组结构,键值和键名都是同一个值,所以输出是相同的值
for(let x of set.values()){
    console.log(x);   // a b c d e f
}
// 使用entries()方法,便是返回两个相同键值对
for(let x of set.entries()){
    console.log(x);   // ["a","a"] ["b","b"] ["c","c"] ["d","d"]......
}

  

  WeakSet结构,与Set结构有两个区别

      1、成员只能是对象,不能是其他类型

      2、弱引用对象,当其他地方不再引用该对象后,这个对象会自动被垃圾回收机制给回收掉,因此不可遍历。

 

 

二、Map:

  与Set结构类似,但是不同的是,Map的结构,键值和键名是不同的,可以一 一对应。

   1、特点:

var map = new Map();

// set方法添加成员
map.set('HJT',"shmily");
map.set('TYY',"emily");

// size属性获取长度
map.size  // 2

// get方法读取相应key的键值
map.get("HJT");           // shmily

//has判断该成员是否存在Map数据结构中
map.has("TYY");          // true
map.has("AAA");          // flase

//delete删除某个成员
map.delete("TYY");       
map.has("TYY");          // flase

// clear清除所有的成员
map.clear();
map.has("HJT");          // flase

  

 

  2、与各类型相互转化

var map = new Map();
map.set('HJT',"shmily");
map.set('TYY',"emily");

// Map转为数组,使用扩展运算符[...]
[...map]

// 数组转为Map,new Map(这里是一个数组)
new Map([...map]);

//Map转为对象,封装一个strMapToObj的方法
function strMapToObj(strMap){
    let obj = Object.create(null);
    for(let [k,v] of strMap){
        obj[k] = v;
    }
    return obj;
}
strMapToObj(map);

// 对象转为Map数据结构,封装一个strObjToMap的方法
function strObjToMap(obj){
    let strMap = new Map();
    for(let k of Object.keys(obj)){
        strMap.set(k,obj[k]);
    }
    return strMap;
}
strObjToMap(某个对象);

// Map转为Json,利用strMapToObj(strMap)方法
function strMapToJson(strMap){
    return JSON.stringify(strMapToObj(strMap));
}
strMapToJson(map);

// Json转为Map结构,利用strObjToMap(obj)方法
function strJsonToMap(obj){
    return JSON.parse(strObjToMap(obj));
}
strJsonToMap(某个对象);

 

  WeakMap结构与Map结构类似,但是只能接受对象作为键名,不接受其他类型的键名(MapSet也是如此),是弱对象引用,常用来防止内存泄漏,当网页中的一个DOM节点绑定了在WeakMap中时,DOM结构在网页中被清除后,WeakMap中相应的成员也会自动被JS回收机制给清除。例如:

var a = docunment.getElementById('a');
var weakMap = new WeakMap();
weakMap.set(a,"xxxxxx");
weakMap.get(a); // xxxxxx

a.parentNode.removeChild(a);
weakMap.get(a); // undefined

 

posted @ 2017-11-15 11:36  Shmily-HJT  阅读(159)  评论(0)    收藏  举报