Skip to content

Set和Map

date: 2020-08-25 16:46:12 tags: [js]

背景

JavaScript的默认对象表示方式 {} 可以视为其他语言中的Map或Dictionary的数据结构,即一组键值对。

但是JavaScript的对象有个小问题,就是键必须是字符串。但实际上Number或者其他数据类型作为键也是非常合理的。为了解决这个问题,最新的ES6规范引入了新的数据类型Map和set.

Set是一种叫做集合的数据结构,Map是一种叫做字典的数据结构

Set

类似于数组,但是成员的值都是唯一的,没有重复的值

基础用法

javascript
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
}

// 去除数组的重复成员
let array = [1,2,1,4,5,3];
[...new Set(array)]     // [1, 2, 4, 5, 3]

方法与属性

javascript
const s = new Set([1,2,3,4])

// 属性
// size:返回字典所包含的元素个数
s.size   // 4

// 方法
// add(value):添加某个值,返回 Set 结构本身
s.add(5)  // Set [1,2,3,4,5 ]

// delete(value):删除某个值,返回一个布尔值,表示删除是否成功。
s.delete(5) // true

// has(value):返回一个布尔值,表示该值是否为 Set 的成员。
s.has(5)  // false

// clear():清除所有成员,无返回值。
s.clear()

遍历方法

javascript
let set = new Set(['a', 'b', 'c']);

// keys():返回键名的遍历器
set.keys() // SetIterator {"a", "b", "c"}
[...set.keys()] // ["a", "b", "c"]

// values():返回键值的遍历器
set.values() // SetIterator {"a", "b", "c"}
[...set.values()] // ["a", "b", "c"]

// entries():返回键值对的遍历器
set.entries()// SetIterator {"a", "b", "c"}
[...set.entries()] // [["a", "a"], ["b", "b"], ["c", "c"]]

// forEach():使用回调函数遍历每个成员,无返回值

Map

它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键,是一种更完善的 Hash 结构实现。如果你需要“键值对”的数据结构,Map 比 Object 更合适;

Map 和 Set区别

  • 共同点:集合、字典可以存储不重复的值
  • 不同点:集合是以[值,值]的形式存储元素,字典是以[键,值]的形式存储

基础用法

javascript
const m = new Map();
const o = {p: 'Hello World'};
m.set(o, 'content')
m.get(o) // "content"

m.has(o) // true
m.delete(o) // true
m.has(o) // false

属性和方法

  • size:返回字典所包含的元素个数
  • set(key, val): 向字典中添加新元素
  • get(key):通过键值查找特定的数值并返回
  • has(key):如果键存在字典中返回true,否则false
  • delete(key): 通过键值从字典中移除对应的数据
  • clear():将这个字典中的所有元素删除

遍历方法

  • keys():将字典中包含的所有键名以数组形式返回
  • values():将字典中包含的所有数值以数组形式返回
  • entries():返回键值对的遍历器
  • forEach():遍历字典的所有成员

京ICP备2024093538号-1