集合和映射

225 阅读3分钟

集合Set

集合是一组值,与数组类似。但与数组不同的是,集合没有索引和顺序,也不允许重复:一个值要么是集合的成员,要么不是;这个值不可能在一个集合中出现多次。下面我们看代码:

创建集合

const t = new Set([1, '1', 2, 2, 3, 1])
const t2 = new Set('32dedad3213')
console.log(t);
console.log(t2);
  • 参数是数组:去重进入集合
  • 参数是字符串:切割后,去重进入集合

原型上的属性

  • size 当前长度
  • add 如果参数是数组,会把数组加进去,而不是拆开加元素。会返回调用它的集合,可以链式调用,如:t.add([12,33,33]).add([12])
  • clear 清空所有数据
  • delete 一次只能删除一个元素,返回一个boolean,删除成功返回true。如果直接调用delete()返回false
  • forEach 因为没有索引和顺序,1、2参数都是元素,第三个参数是数据自身
  • has 集合中是否有相同的值,返回boolean
  • keys 返回一个值集合,这个集合有next属性可以挨个去下一个值
  • values 返回一个值集合,这个集合有next属性可以挨个去下一个值
  • entries 参考forEach,返回的key,value一样
  • Symbol.iterator 可以被迭代

需要注意的点

  1. 判重:delete、has和判重是根据===,数字1和字符串‘1’不会判重复,引用类型只有用同一个引用才会判重
  2. 可以用扩展副...扩展开,也能[...t]转数组

映射Map

Map表示一组被称为键的值,每一个值都关联(映射)到另一个值,但是它的键值不只整数或字符串,允许任何值作为索引,不管体积多大,映射速度都很快。

创建映射

const m = new Map([['3weqw', 'eewq'], [1, 2]])

参数:多个数组,每个数组有两个值,第一个作为键,第二个是value

原型上的属性

  • clear 清空
  • delete 成功返回true 失败(没有)返回false
  • entries 键值对组成的MapIterator
  • forEach 1参数是value、2参数都是key,第三个参数是数据自身
  • get 获取一项元素,若key不存在返回undefined
  • has 是否有参数key,返回boolean
  • keys 所有key组成的MapIterator
  • set 添加/修改键值对
  • size 键值对的个数
  • values 所有value组成的MapIterator
  • Symbol.iterator 可以被迭代

Map与Object

  1. Object键值是整数、字符串或者symbol,Map是任何值都可以(引用值根据引用决定是否是同一key)
  2. Map 元素的顺序遵循插入的顺序,而 Object 的则没有这一特性。
  3. JSON 直接支持 Object,但不支持 Map
  4. Map 是纯粹的 hash, 而 Object 还存在一些其他内在逻辑,所以在执行 delete 的时候会有性能问题。所以写入删除密集的情况应该使用 Map。
  5. Map 在存储大量元素的时候性能表现更好,特别是在代码执行时不能确定 key 的类型的情况。