Set数据结构

 属性:

  • constructor:构造函数,默认就是Set函数。
  • size:返回Set实例的成员总数。

操作方法: 

  • add(value):添加某个值,返回 Set 结构本身。
  • delete(value):删除某个值,返回一个布尔值,表示删除是否成功。
  • has(value):返回一个布尔值,表示该值是否为Set的成员。
  • clear():清除所有成员,没有返回值。

遍历方法:

  • keys():返回键名的遍历器对象。
  • values():返回键值的遍历器对象。
  • entries():返回键值对的遍历器对象。
  • forEach((item)=>{}):使用回调函数遍历每个成员。

Set 实例添加了两次NaN,但是只会加入一个。这表明,在 Set 内部,两个NaN是相等的 ;

Set中,两个对象总是不相等的。因为两个对象内存地址不一样;

 Map数据结构

 属性:

  • constructor:构造函数,默认就是Map函数。
  • size:返回 Map 结构的成员总数。

操作方法: 

  • add(value):添加某个值,返回 Map结构本身。
  • delete(value):删除某个值,返回一个布尔值,表示删除是否成功。
  • has(value):返回一个布尔值,表示该值是否为Map的成员。
  • clear():清除所有成员,没有返回值。

遍历方法:

  • keys():返回键名的遍历器对象。
  • values():返回键值的遍历器对象。
  • entries():返回键值对的遍历器对象。
  • forEach((value,key)=>{}):使用回调函数遍历每个成员 第一个参数为value,第二个参数为key'。

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

(1)Map 转为数组

前面已经提过,Map 转为数组最方便的方法,就是使用扩展运算符(...)。

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

    console.log([...map.keys()]); //[1, 2, 3]
    console.log([...map.values()]); // ["one", "two", "three"]

(2)数组 转为 Map

将数组传入 Map 构造函数,就可以转为 Map。

let arr = [[1, 'one'],[2, 'two'],[3, 'three'],];
    let map = new Map(arr);
    console.log(map);

(3)Map 转为对象

如果所有 Map 的键都是字符串,它可以无损地转为对象。

function strMapToObj(strMap) {
        let obj = Object.create(null);//创建空的对象
        for (let [k, v] of strMap) {
            obj[k] = v;
        }
        return obj;
    }

    const myMap = new Map()
        .set('yes', true)
        .set('no', false);

    console.log(strMapToObj(myMap)); 
// { yes: true, no: false }

如果有非字符串的键名,那么这个键名会被转成字符串,再作为对象的键名。

(4)对象转为 Map

对象转为 Map 可以通过Object.entries()。 Object.keys() //返回对象的键名 Object.entries() //以数组形式返回对象的键值对


obj ==>数组==>map


let obj = {"a":1, "b":2};
Object.entries(obj) //[['a',1],['b',2]]
let map = new Map(Object.entries(obj));

此外,也可以自己实现一个转换函数。

function objToStrMap(obj) {
  let strMap = new Map();
  for (let k of Object.keys(obj)) {
    strMap.set(k, obj[k]);
  }
  return strMap;
}

objToStrMap({yes: true, no: false})
// Map {"yes" => true, "no" => false}

(5)Map 转为 JSON

Map 转为 JSON 要区分两种情况。一种情况是,Map 的键名都是字符串,这时可以选择转为对象 JSON。


map==>obj==>json


function strMapToObj(strMap) {
        let obj = Object.create(null);//创建空的对象
        for (let [k, v] of strMap) {
            obj[k] = v;
        }
        return obj;
    }
    
    function strMapToJson(strMap) {
        return JSON.stringify(strMapToObj(strMap));
    }

    let myMap = new Map().set('yes', true).set('no', false);
    console.log(strMapToJson(myMap)); 
// '{"yes":true,"no":false}'

(6)JSON 转为 Map

JSON 转为 Map,正常情况下,所有键名都是字符串。


json==>obj===>map jsonString == > obj ==> map


function jsonToStrMap(jsonStr) {
  return objToStrMap(JSON.parse(jsonStr));
}

jsonToStrMap('{"yes": true, "no": false}')
// Map {'yes' => true, 'no' => false}



  function objToStrMap(obj) {
        let strMap = new Map();
        for (let k of Object.keys(obj)) {
            strMap.set(k, obj[k]);
        }
        return strMap;
    }

    function jsonToStrMap(jsonStr) {
        return objToStrMap(JSON.parse(jsonStr));
    }

    console.log(jsonToStrMap('{"yes": true, "no": false}'));