目录

集合

Set集合

初始化

Set API

Map集合

初始化

Map API(与set类似)


 

集合

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 有一些重要的区别,对比如下:

MapObject
意外的键Map 默认情况不包含任何键。只包含显式插入的键。一个 Object 有一个原型, 原型链上的键名有可能和你自己在对象上的设置的键名产生冲突。注意: 虽然 ES5 开始可以用 Object.create(null) 来创建一个没有原型的对象,但是这种用法不太常见。
键的类型一个 Map的键可以是任意值,包括函数、对象或任意基本类型。一个Object 的键必须是一个 String 或是Symbol。
键的顺序Map 中的 key 是有序的。因此,当迭代的时候,一个 Map 对象以插入的顺序返回键值。一个 Object 的键是无序的。注意:自ECMAScript 2015规范以来,对象确实保留了字符串和Symbol键的创建顺序; 因此,在只有字符串键的对象上进行迭代将按插入顺序产生键。
SizeMap 的键值对个数可以轻易地通过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 () {}
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐