set&map

2020-02-03  本文已影响0人  Super曲江龙Kimi

Set

Set 能够保存一组不重复的值,可以保存任何值,一般可以用于去重

基本api

// 内部基本是使用类似===来做判断,也可以区分出NaN为相同值

let a = new Set([1,2])
a.add('1');  // 1 和 '1' 不相同   { 1 ,2, '1' }
a.add(NaN); // { 1 ,2, '1',  NaN }
a.add(NaN); // NaN 和 NaN相同  { 1 ,2, '1',  NaN }
a.add(1);  // { 1 ,2, '1',  NaN }
a.add(3); // { 1 ,2, '1',  NaN, 3 }
a.size;  // 5 
a.delete(2); // { 1, '1',  NaN,  3 }
a.has(2); // false
a.clear(); // {}

// new Set() 初始化可以传入一个有iterable接口的值。字符串或者数组

const a = new Map([['a',1],['b',2]])
const b = new Set(a);
console.log(b)   // { ['a', 1], ['b', 2] }

使用场景

可以用来非对象数组去重和字符串去重,或者求交集,差集,并集

// 数组去重
const a = [1,2,3,4,3,3,4,5]
console.log([...new Set(a)])  // [1,2,3,4,5]

// 字符串去重
const a = "123456452";
console.log([...new Set(a)].join("")) // "123456"

//  set也可以利用数组的map和filter方法来计算
let a = new Set([1, 2, 3]);
let c = new Set([...a].map(v => v*2)) 
console.log(c); // {2,4,6}

// 求交集,并集,差集
let a = new Set([1, 2, 3]);
let b = new Set([4, 3, 2]);

new Set([...a, ...b]); // 并集
new Set([...a].filter(v => b.has(v))); // 交集
new Set([...a].filter(v => !b.has(v))); // 差集

遍历

// values() keys() entries()都返回一个iterator对象,需要使用for of遍历

const a = new Set([1,2,3,4])
for (let v of a.values()) {
    console.log(v)
}
for (let k of a.keys()) {
    console.log(k)
}
for (let [v, k] of a.entries()) {
    console.log(v)
    console.log(k)
}

//  Set 结构的实例默认可遍历,它的默认遍历器生成函数就是它的values方法
Set.prototype[Symbol.iterator] === Set.prototype.values

for (let v of a) {
  console.log(v) // 和a.values()行为一致
}

// 可以使用foreach
const a = new Set([1,2,3,4])

a.forEach((v,i) => {
    console.log(v, i);     // 1 1, 2 2, 3 3, 4 4 
})

weakSet

WeakSet 的成员只能是对象,所有的对象都是弱引用,不会被垃圾回收机制的引用标记。即垃圾回收机制不考虑 WeakSet 对该对象的引用,也就是说,如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存,不考虑该对象还存在于 WeakSet 之中。

Map

Map 能够保存一组键值对的数据,可以使用任何数据结构当做key。

基本api

const a = new Map([['a',1], ['b',2]])
a.set('c', 3); // {'a' => 1, 'b' => 2, 'c' => 3}
a.set('c', 4); // {'a' => 1, 'b' => 2, 'c' => 4}  覆盖
a.get('c'); // 4
a.size; // 3
a.delete('a'); // {'b' => 2, 'c' => 4}
a.clear(); // {}

// new Map() 初始化可以传入一个有iterable接口的值。并且必须是二维的。set、map或者数组。

const a = new Set([['a',1], ['b',2]])
const b = new Map(a);
console.log(b);

遍历

const map = new Map([
  ['F', 'no'],
  ['T',  'yes'],
]);

for (let key of map.keys()) {
  console.log(key);
}
// "F"
// "T"

for (let value of map.values()) {
  console.log(value);
}
// "no"
// "yes"

for (let item of map.entries()) {
  console.log(item[0], item[1]);
}
// "F" "no"
// "T" "yes"

// 或者
for (let [key, value] of map.entries()) {
  console.log(key, value);
}
// "F" "no"
// "T" "yes"

// 等同于使用map.entries() 因为  map[Symbol.iterator] === map.entries
for (let [key, value] of map) {
  console.log(key, value);
}
// "F" "no"
// "T" "yes"

set和map快速转换成数组的方法都是使用扩展运算符...

上一篇下一篇

猜你喜欢

热点阅读