美文网首页
ES6中Set和Map数据结构

ES6中Set和Map数据结构

作者: 楓叶树上的行者 | 来源:发表于2018-07-04 22:42 被阅读0次

    Set 数据结构

    一、基本用法

    1、数据结构Set,类似于数组,成员的值都是唯一的,没有重复的值。

    2、Set本身是一个构造函数,用来生成Set数据结构。

    const s = new Set();
    [2, 3, 5, 4, 5, 2, 2].forEach(x => s.add(x));
    for (let i of s) {
        console.log(i);
    }
    // 2 3 5 4
    

    3、Set函数去除数组重复成员的方法。

    (1)去除数组的重复成员
    let arr = [3, 5, 2, 2, 5, 5];
    [...new Set(arr)]
    
    (2)去除数组重复成员的另一种方:  
    function dedupe(array) {
         return Array.from(new Set(array));
    }
    dedupe([1, 1, 2, 3]) // [1, 2, 3]
    

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

    let set = new Set();
    let a = NaN;
    let b = NaN;
    set.add(a);
    set.add(b);
    set // Set {NaN} 
    注:只能向Set实例中加入一个NaN,这表明,在Set内部,两个NaN是相等。(对象总是不相等的)
    

    二、Set实例的属性和方法

    1、Set结构的实例属性:

            - Set.prototype.constructr:构造函数,默认就是Set函数。
            - Set.prototype.size:返回Set实例的成员总数。

    2.Set实例的方法分为两大类:操作方法(用于操作数据)和遍历方法(用于遍历成员)。

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

    属性和方法的实例:
    s.add(1).add(2).add(2);
    // 注意2被加入了两次
    
    s.size // 2
    
    s.has(1) // true
    s.has(2) // true
    s.has(3) // false
    
    s.delete(2);
    s.has(2) // false
    

    3、Array.from方法可以将Set结构转为数组。

    const items = new Set([1, 2, 3, 4, 5]);
    const array = Array.from(items);
    

    三、遍历操作

    1、Set的结构实例的遍历方法

            - keys():返回键名的遍历器
            - values():返回键值的遍历器
            - entries():返回键值对的遍历器
            - forEach():使用回调函数遍历每个成员
    注:Set结构的键名和键值,两者是同一个值。

    2、使用Set可以很容易地实现并集(Union)、交集(Intersect)和差集(Difference)。

    let a = new Set([1, 2, 3]);let b = new Set([4, 3, 2]);
    // 并集
    let union = new Set([...a, ...b]);
    // Set {1, 2, 3, 4}
    
    // 交集
    let intersect = new Set([...a].filter(x => b.has(x)));
    // set {2, 3}
    
    // 差集
    let difference = new Set([...a].filter(x => !b.has(x)));
    // Set {1}
    

    Map 数据结构

    一、含义和基本用法

    1、Map 数据结构。它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。

    二、实例的属性和操作方法

    1、size属性

    size属性返回Map结构的成员总数。
    例:
    const map = new Map();
    map.set('foo', true);
    map.set('bar', false);
    map.size // 2
    

    2、set(key,value)

    set方法设置键名key对应的键名为value,然后返回整个Map结构。如果key已经有值,则键值会被更新,否则就新成该键。
    例:
    const m = new Map();
    
    m.set('edition', 6)      // 键是字符串
    m.set(262, 'standard')    // 键是数值
    m.set(undefined, 'nah')  // 键是 undefined
    

    3、get(key)

    get方法读取key对应的键值,如果找不到key,返回undefined。
    例:
    const m = new Map();
    
    const hello = function() {console.log('hello');};
    m.set(hello, 'Hello ES6!') // 键是函数
    m.get(hello) // Hello ES6!
    

    4、has(key)

    has方法返回一个布尔值,表示某个键是否在当前Map对象之中。
    例:
    const m = new Map();
    
    m.set('edition', 6);
    m.set(262, 'standard');
    m.set(undefined, 'nah');
    
    m.has('edition')    // true
    m.has('years')      // false
    m.has(262)          // true
    m.has(undefined)    // true
    

    5、delete(key)

    delete方法删除某个键,返回true。如果删除失败,返回false。
    例:
    const m = new Map();
    m.set(undefined, 'nah');
    m.has(undefined)    // true
    
    m.delete(undefined)
    m.has(undefined)      // false
    

    6、clear()

    clear方法清除所有成员,没有返回值。
    例:
    let map = new Map();
    map.set('foo', true);
    map.set('bar', false);
    
    map.size // 2
    map.clear()
    map.size // 0
    

    三、遍历方法

    1、Map结构提供了三个遍历器生成函数和一个遍历方法。

            - keys():返回键名的遍历器。
            - values():返回键值的遍历器。
            - entries():返回所有成员的遍历器。
            - forEach():遍历 Map 的所有成员。

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

    1、Map转位数组

    使用扩展运算符,是最为方便的方法。
    例:
    const myMap = new Map()
         .set(true, 7)
         .set({foo: 3}, ['abc']);[...myMap]
    // [ [ true, 7 ], [ { foo: 3 }, [ 'abc' ] ] ]
    

    2、数组转为Map

    将数组传入Map构造函数,就可以转为Map。
    例:
    new Map([
        [true, 7],
        [{foo: 3}, ['abc']]])
    // Map {
    //  true => 7,
    //  Object {foo: 3} => ['abc']
    // }
    

    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);strMapToObj(myMap)
    // { yes: true, no: false }
    

    4、对象转为Map

    例:
    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

    (1)Map键名都是字符串,这时可以选择转为对象JSON。
    例:
    function strMapToJson(strMap) {
        return JSON.stringify(strMapToObj(strMap));
    }
    
    let myMap = new Map().set('yes', true).set('no', false);strMapToJson(myMap)
    // '{"yes":true,"no":false}'
    (2)Map的键名有非字符串,这时可以选择转为数组JSON。
    例:
    function mapToArrayJson(map) {
         return JSON.stringify([...map]);
    }
    
    let myMap = new Map().set(true, 7).set({foo: 3}, ['abc']);mapToArrayJson(myMap)
    // '[[true,7],[{"foo":3},["abc"]]]'
    

    6、JSON转为Map

    JSOP转为Map,正常情况下,所有键名都是字符串。
    例:
    function jsonToStrMap(jsonStr) {
         return objToStrMap(JSON.parse(jsonStr));
    }
    
    jsonToStrMap('{"yes": true, "no": false}')
    // Map {'yes' => true, 'no' => false}
    

    相关文章

      网友评论

          本文标题:ES6中Set和Map数据结构

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