目录
集合
Set集合
初始化
Set类似于数组,但是成员的值都是唯一的,没有重复的值。Set 本身是一个构造函数,用来生成 Set 数据结构展。Set 构造函数可以接受一个数组(或者具有 iterable 接口的其他数据结构)作为参数,用来初始化。
Set集合比较特殊,内部只需要存储一个值,set集合的key和value一样。
let set = new Set(); console.log(set); // 打印出: Set [] // 使用set可以用来给数组去重 let arr = [...new Set([1,2,4,4])]; console.log(arr); // 打印出 Array(3) [ 1, 2, 4 ]
Set API
获取元素总数 Set.prototype.size
返回Set实例的元素总数
// 创建set集合对象 let set = new Set(); // 添加成员 set.add('hello'); // 添加成员 set.add('briup'); console.log(set); //Set(2) { 'hello', 'briup' } console.log('Set实例的元素总数:', set.size); //Set实例的元素总数: 2
添加元素
Set.prototype.add(value)
添加某个值,返回Set结构本身,不能添加重复的值
set.add('hello'); set.add('briup'); set.add('briup'); // 添加重复的值无效 console.log(set); //Set(2) { 'hello', 'briup' }
删除元素
Set.prototype.delete(value)
删除某个值,返回一个布尔值,表示删除是否成功
set.delete('hello'); console.log(set); // Set(1) { 'briup' }
判断是否包含某个元素
Set.prototype.has(value)
返回一个布尔值,表示该值是否为Set的元素。
let bool = set.has('briup'); console.log(bool); //true let bool2 = set.has('ronda'); console.log(bool2); //false
清空set
Set.prototype.clear()
清除所有元素,没有返回值。
let set = new Set(); set.add('hello'); set.add('briup'); console.log(set); //Set(2) { 'hello', 'briup' } // 清空set set.clear(); console.log(set); //Set(0) {}
获取所有元素值
Set.prototype.values()
返回键值的遍历器
方法按照元素插入顺序返回一个具有 Set 对象每个元素值的全新 Iterator 对象。 Set.prototype.keys()
keys方法是这个values方法的别名(与 Map 对象相似);他们的行为一致,都是返回Set 对象中的元素值。
let set = new Set(); set.add('hello'); set.add('briup'); console.log(set); //Set(2) { 'hello', 'briup' } // 获取set集合的values let values = set.values(); // 获取set集合的keys,与values一样 let keys = set.keys(); console.log(values); //[Set Iterator] { 'hello', 'briup' } console.log(keys); //[Set Iterator] { 'hello', 'briup' }
遍历器对象的遍历可以使用
for-of
遍历let set = new Set(); set.add('hello'); set.add('briup'); console.log(set); let values = set.values(); for (let value of values) { console.log(value); }
获取[key,value]键值对
Set.prototype.entries() 返回一个新的键值对的迭代器对象 ,这个对象的元素是类似 [value, value] 形式的数组,value 是集合对象中的每个元素,迭代器对象元素的顺序即集合对象中元素插入的顺序。由于集合对象不像 Map 对象那样拥有 key,然而,为了与 Map 对象的 API 形式保持一致,故使得每一个 entry 的 key 和 value 都拥有相同的值,因而最终返回一个 [value, value] 形式的数组。
let set = new Set(); set.add('hello'); set.add('briup'); console.log(set); //Set(2) { 'hello', 'briup' } // 获取set集合的values let entries = set.entries(); console.log(entries); //[Set Entries] { [ 'hello', 'hello' ], [ 'briup', 'briup' ] } for (let entry of entries) { console.log(entry); //键值对数组,其中key与value一样 }
遍历set
Set.prototype.forEach((currentValue,currentKey[,set])=>{},this) 根据集合中元素的插入顺序,依次执行提供的回调函数。但是由于集合对象中没有索引(keys),所以前两个参数都是Set中元素的值(values)
let set = new Set(); set.add('hello'); set.add('briup'); console.log(set); //Set(2) { 'hello', 'briup' } set.forEach((value, key, set) => { console.log(value, key, set); })
Map集合
初始化
Map 对象保存键值对,并且能够记住键的原始插入顺序。任何值(对象或者原始值) 都可以作为一个键或一个值。Map类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。也就是说,Object 结构提供了“字符串—值”的对应,Map结构提供了“值—值”的对应,是一种更完善的 Hash 结构实现。如果你需要“键值对”的数据结构,Map 比 Object 更合适。Map 可以接受一个数组作为参数。该数组的成员是一个个表示键值对的数组。
一个Map对象在迭代时会根据对象中元素的插入顺序来进行 — 一个 for...of 循环在每次迭代后会返回一个形式为[key,value]的数组。
Tip:Objects 和 maps 的比较 Objects 和 Maps 类似的是,它们都允许你按键存取一个值、删除键、检测一个键是否绑定了值。因此(并且也没有其他内建的替代方式了)过去我们一直都把对象当成 Maps 使用。不过 Maps 和 Objects 有一些重要的区别,对比如下:
Map Object 意外的键 Map 默认情况不包含任何键。只包含显式插入的键。 一个 Object 有一个原型, 原型链上的键名有可能和你自己在对象上的设置的键名产生冲突。注意: 虽然 ES5 开始可以用 Object.create(null) 来创建一个没有原型的对象,但是这种用法不太常见。 键的类型 一个 Map的键可以是任意值,包括函数、对象或任意基本类型。 一个Object 的键必须是一个 String 或是Symbol。 键的顺序 Map 中的 key 是有序的。因此,当迭代的时候,一个 Map 对象以插入的顺序返回键值。 一个 Object 的键是无序的。注意:自ECMAScript 2015规范以来,对象确实保留了字符串和Symbol键的创建顺序; 因此,在只有字符串键的对象上进行迭代将按插入顺序产生键。 Size Map 的键值对个数可以轻易地通过size 属性获取 Object 的键值对个数只能手动计算 迭代 Map 是 iterable 的,所以可以直接被迭代。 迭代一个Object需要以某种方式获取它的键然后才能迭代。 性能 在频繁增删键值对的场景下表现更好。 在频繁添加和删除键值对的场景下未作出优化。 let map = new Map([ ['name', '张三'], ['title', 'Author'] ]); // map是 Map { name → "张三", title → "Author" }
Map API(与set类似)
获取成员总数 Map.prototype.size 返回Map对象的键/值对的数量。
添加成员 Map.prototype.set(key, value) set方法设置键名key对应的键值为value,然后返回整个map结构。如果key已经有值,则键值会被更新,否则就新生成该键。
通过key获取value Map.prototype.get(key) get方法读取key对应的键值,如果找不到key,返回undefined。
是否包含某个成员key Map.prototype.has(key) has方法返回一个布尔值,表示某个键是否在当前 Map 对象之中。
删除成员 Map.prototype.delete(key) delete方法删除某个键,返回true。如果删除失败,返回false。
清空集合 Map.prototype.clear() 清除所有成员,没有返回值
获取key Map.prototype.keys() 返回键名的遍历器
获取value Map.prototype.values() 返回键值的遍历器
获取[key,value]键值对 Map.prototype.entries() 返回键值对的遍历器
遍历集合 Map.prototype.forEach() 使用回调函数遍历每个成员
//创建一个map集合 let myMap = new Map(); let keyObj = {}; let keyFunc = function() {}; let keyString = 'a string'; // 添加键 myMap.set(keyString, "和键'a string'关联的值"); myMap.set(keyObj, "和键keyObj关联的值"); myMap.set(keyFunc, "和键keyFunc关联的值"); myMap.size; // 3 // 读取值,通过key获取value值 myMap.get(keyString); // "和键'a string'关联的值" myMap.get(keyObj); // "和键keyObj关联的值" myMap.get(keyFunc); // "和键keyFunc关联的值" // 因为keyString === 'a string' myMap.get('a string'); // "和键'a string'关联的值" myMap.get({}); // undefined, 因为keyObj !== {} myMap.get(function() {}); // undefined, 因为keyFunc !== function () {}
ES6中Set集合、Set API、Map集合、Map API
于 2022-05-11 00:08:53 首次发布