set&map

作者: Super曲江龙Kimi | 来源:发表于2020-02-03 19:03 被阅读0次

    Set

    Set 能够保存一组不重复的值,可以保存任何值,一般可以用于去重

    基本api

    // 内部基本是使用类似===来做判断,也可以区分出NaN为相同值

    let a = new Set([1,2])
    a.add('1');  // 1 和 '1' 不相同   { 1 ,2, '1' }
    a.add(NaN); // { 1 ,2, '1',  NaN }
    a.add(NaN); // NaN 和 NaN相同  { 1 ,2, '1',  NaN }
    a.add(1);  // { 1 ,2, '1',  NaN }
    a.add(3); // { 1 ,2, '1',  NaN, 3 }
    a.size;  // 5 
    a.delete(2); // { 1, '1',  NaN,  3 }
    a.has(2); // false
    a.clear(); // {}
    

    // new Set() 初始化可以传入一个有iterable接口的值。字符串或者数组

    const a = new Map([['a',1],['b',2]])
    const b = new Set(a);
    console.log(b)   // { ['a', 1], ['b', 2] }
    

    使用场景

    可以用来非对象数组去重和字符串去重,或者求交集,差集,并集

    // 数组去重
    const a = [1,2,3,4,3,3,4,5]
    console.log([...new Set(a)])  // [1,2,3,4,5]
    
    // 字符串去重
    const a = "123456452";
    console.log([...new Set(a)].join("")) // "123456"
    
    //  set也可以利用数组的map和filter方法来计算
    let a = new Set([1, 2, 3]);
    let c = new Set([...a].map(v => v*2)) 
    console.log(c); // {2,4,6}
    
    // 求交集,并集,差集
    let a = new Set([1, 2, 3]);
    let b = new Set([4, 3, 2]);
    
    new Set([...a, ...b]); // 并集
    new Set([...a].filter(v => b.has(v))); // 交集
    new Set([...a].filter(v => !b.has(v))); // 差集
    

    遍历

    // values() keys() entries()都返回一个iterator对象,需要使用for of遍历

    const a = new Set([1,2,3,4])
    for (let v of a.values()) {
        console.log(v)
    }
    for (let k of a.keys()) {
        console.log(k)
    }
    for (let [v, k] of a.entries()) {
        console.log(v)
        console.log(k)
    }
    
    //  Set 结构的实例默认可遍历,它的默认遍历器生成函数就是它的values方法
    Set.prototype[Symbol.iterator] === Set.prototype.values
    
    for (let v of a) {
      console.log(v) // 和a.values()行为一致
    }
    
    // 可以使用foreach
    const a = new Set([1,2,3,4])
    
    a.forEach((v,i) => {
        console.log(v, i);     // 1 1, 2 2, 3 3, 4 4 
    })
    

    weakSet

    WeakSet 的成员只能是对象,所有的对象都是弱引用,不会被垃圾回收机制的引用标记。即垃圾回收机制不考虑 WeakSet 对该对象的引用,也就是说,如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存,不考虑该对象还存在于 WeakSet 之中。

    Map

    Map 能够保存一组键值对的数据,可以使用任何数据结构当做key。

    基本api

    const a = new Map([['a',1], ['b',2]])
    a.set('c', 3); // {'a' => 1, 'b' => 2, 'c' => 3}
    a.set('c', 4); // {'a' => 1, 'b' => 2, 'c' => 4}  覆盖
    a.get('c'); // 4
    a.size; // 3
    a.delete('a'); // {'b' => 2, 'c' => 4}
    a.clear(); // {}
    

    // new Map() 初始化可以传入一个有iterable接口的值。并且必须是二维的。set、map或者数组。

    const a = new Set([['a',1], ['b',2]])
    const b = new Map(a);
    console.log(b);
    

    遍历

    const map = new Map([
      ['F', 'no'],
      ['T',  'yes'],
    ]);
    
    for (let key of map.keys()) {
      console.log(key);
    }
    // "F"
    // "T"
    
    for (let value of map.values()) {
      console.log(value);
    }
    // "no"
    // "yes"
    
    for (let item of map.entries()) {
      console.log(item[0], item[1]);
    }
    // "F" "no"
    // "T" "yes"
    
    // 或者
    for (let [key, value] of map.entries()) {
      console.log(key, value);
    }
    // "F" "no"
    // "T" "yes"
    
    // 等同于使用map.entries() 因为  map[Symbol.iterator] === map.entries
    for (let [key, value] of map) {
      console.log(key, value);
    }
    // "F" "no"
    // "T" "yes"
    

    set和map快速转换成数组的方法都是使用扩展运算符...

    相关文章

      网友评论

          本文标题:set&map

          本文链接:https://www.haomeiwen.com/subject/xgckxhtx.html