天行健, 君子以自强不息
Sunny's Blog
Title

ES6 Demos(七) Sets and Maps(Set与Map)

ES6 向 JS 添加了 Set 与 Map。ES5可以通过对象来进行模拟,set主要用来检查键的存在性。map多数被用来提取数据。

Demo1: ES5模拟set遇到的一个问题

                let map = Object.create(null);
                map.count = 0;

                // 是想检查 "count" 属性的存在性,还是想检查非零值?
                if (map.count) {
                // ...
                }   
                
            

Demo2: ES6的Set

ES6 新增了 Set 类型,这是一种无重复值的有序列表。 Set 允许对它包含的数据进行快速访问,从而增加了一个追踪离散值的更有效方式。

Set 使用 new Set() 来创建,而调用 add() 方法就能向 Set 中添加项目,检查 size 属性还能查看其中包含有多少项

                let set = new Set();
                //Set 不会使用强制类型转换来判断值是否重复。这意味着 Set 可以同时包含数值 5 与 字符串 "5" ,将它们都作为相对独立的项
                set.add(5);
                set.add("5");

                //如果 add() 方法用相同值进行了多次调用,那么在第一次之后的调用实际上会被忽略
                set.add(5); // 重复了,该调用被忽略

                console.log(set.size); // 2


                //你可以使用数组来初始化一个 Set ,并且 Set 构造器会确保不重复地使用这些值

                let set2 = new Set([1, 2, 3, 4, 5, 5, 5, 5]);
                console.log(set2.size); // 5

                //你可以使用 has() 方法来测试某个值是否存在于 Set 中
                console.log(set.has(5)); // true
                console.log(set.has(6)); // false

                //移除值

                set.delete(5);
                console.log(set.has(5)); // false
                console.log(set.size); // 1

                set.clear();
                console.log(set.has("5")); // false
                console.log(set.size); // 0            
            

总结Set: 可区分5和“5”, 可去重, 用has来检测,用clear/delete来移除值

Demo2-1: Set 上的 forEach() 方法

                //数组调用forEach

                let array1 = ['sunny','stella','sheldon'];

                array1.forEach(function(value, index, own){
                    console.log(value); //'sunny','stella','sheldon'
                    console.log(index); // 0, 1, 2
                    console.log(own); //array1本身
                });

                //Set调用forEach

                let set1 = new Set(['sunny','stella','sheldon']);

                // 将 Set 中的每一项同时认定为键与值。于是为了让 Set 的
                // forEach() 方法与数组及 Map 版本的保持一致,该回调函数的前两个参数就始终相同了
                set1.forEach(function(value, index, own){
                    console.log(value); //'sunny','stella','sheldon'
                    console.log(index); //'sunny','stella','sheldon'
                    console.log(own); //array1本身
                });           
            

Demo2-2: Set与数组相互转换

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

                //使用这个方法可以进行数组去重            
            

Demo2-3: WeakSet (不常用,暂略)

Set 是无重复值的有序列表。根据 Object.is() 方法来判断其中的值不相等,以保证无重复。 Set 会自动移除重复的值,因此你可以使用它来过滤数组中的重复值并返回结果。 Set并不是数组的子类型,所以你无法随机访问其中的值。但你可以使用 has() 方法来判断某个值是否存在于 Set 中,或通过 size 属性来查看其中有多少个值。 Set 类型还拥有forEach() 方法,用于处理每个值。

Demo3: ES6 的 Map

                let map = new Map();

                map.set("title", "Understanding ES6");
                map.set("year", 2016);

                console.log(map.get("title")); // "Understanding ES6"
                console.log(map.get("year")); // 2016

                //如果任意一个键不存在于 Map 中, 则 get() 方法就会返回特殊值 undefined 。

                // 以下三个方法在 Map 与 Set 上都存在:
                // has(key) :判断指定的键是否存在于 Map 中;
                // delete(key) :移除 Map 中的键以及对应的值;
                // clear() :移除 Map 中所有的键与值。

                // Map 同样拥有 size 属性,用于指明包含了多少个键值对

                //Map可以一次性进行填充
                let map = new Map([["name", "Nicholas"], ["age", 25]]);
                console.log(map.has("name")); // true
                console.log(map.get("name")); // "Nicholas"
                console.log(map.has("age")); // true
                console.log(map.get("age")); // 25
                console.log(map.size); // 2            
            

Demo3-1: Map 上的 forEach() 方法

                let map1 = new Map([[5,'sunny'], ['5','stella'], [6,'sheldon']]);

                map1.forEach(function(value, index, own){
                    console.log(value); //'sunny','stella','sheldon'
                    console.log(index); //5,5,6
                    console.log(own); //map1本身
                });            
            

Demo3-2: Map Weak Map(不常用,暂略)

Map 是有序的键值对,其中的键允许是任何类型。与 Set 相似,通过调用 Object.is() 方法来判断重复的键,这意味着能将数值 5 与字符串 "5" 作为两个相对独立的键。使用set() 方法能将任何类型的值关联到某个键上,并且该值此后能用 get() 方法提取出来。Map 也拥有一个 size 属性与一个 forEach() 方法,让项目访问更容易。

地势坤,君子以厚德载物