es6学习之Set和Map结构

一.Set结构

Set结构是类似于数组结构,但是成员都是不重复的值(判断不重复类似Object.is()方法,但是+0和-0又是相同的处理,Object.is(+0,-0); // false)

缺点是没办法像数组一样通过下标取值的方法.

WeekSet结构和Set相似,但是成员只能是对象,且对象是弱引用(成员中的对象不存在了,在本结构中也就不存在了),重点是没有size属性,没有遍历接口

1.构造

任何具有Iterator接口的数据结构都能作为new Set的参数

let set = new Set([1,2,3]);
set.size    // 3

2.属性和方法

(1)属性

  • Set.prototype.constructor 构造函数:就是set本身
  • Set.prototype.size :set的成员总数

(2)操作方法

  • add(value) 添加值,返回添加后set本身
  • delete(value) 删除某个值,返回Boolean,是否删除成功
  • has(value) 是否含有某一个值,返回Boolean,是否有这个值
  • clear() 请求所有成员,void
  • s.add(1).add(2).add(2);
    // 注意2被加入了两次
s.size // 2

s.has(1) // true
s.has(2) // true
s.has(3) // false

s.delete(2);  // true
s.has(2) // false

(3)遍历方法

  • keys() 返回键名的遍历器
  • values() 返回键值的遍历器
  • entries() 返回键值对的遍历器
  • forEach() 使用回掉函数遍历每一个set成员
let set = new Set(['red', 'green', 'blue']);
for (let item of set.keys()) {
  console.log(item);
}
// red
// green
// blue

for (let item of set.values()) {
  console.log(item);
}
// red
// green
// blue

for (let item of set.entries()) {
  console.log(item);
}
// ["red", "red"]
// ["green", "green"]
// ["blue", "blue"]

set2 = new Set([1, 4, 9]);
set2.forEach((value, key) => console.log(key + ' : ' + value))
// 1 : 1
// 4 : 4
// 9 : 9

3.应用

(1)数组去重

let arr = [1,2,3,4,5,4,23,1,3];
arr= Array.from(new Set(arr));  // [1, 2, 3, 4, 5, 23]

(2)扩展运算符解构set

let arr = [1,2,3,4,5,4,23,1,3];
let set = new Set(arr);
let arr4 = [...set];    // [1, 2, 3, 4, 5, 23]

(3)set实现交集,并集,差集

let a = new Set([1, 2, 3]);
let b = new Set([4, 3, 2]);
// 并集
let union = new Set([...a, ...b]);
// Set {1, 2, 3, 4}

// 交集
let intersect = new Set([...a].filter(x => b.has(x)));
// set {2, 3}

// 差集
let difference = new Set([...a].filter(x => !b.has(x)));
// Set {1}

二.Map结构

Map结构是键值对集合(Hash结构).Map可以使用对象作为键名.map内部的键名的重复检测和Set相同
WeekMap结构类似Map,区别是键名只能是对象,且对象是弱引用,类似于WeekSet的弱引用

1.构造

任何具有Iterator接口的数据结构都能被Map构造为Map结构,但是结构要有一定的定制,类似于下方的数组的结构

const map = new Map([
  ['name', '张三'],
  ['title', 'Author']
]);

map.size // 2
map.has('name') // true
map.get('name') // "张三"
map.has('title') // true
map.get('title') // "Author"

2.属性和方法

(1)属性

  • Map.prototype.size :Map的成员数量

(2)操作方法

  • set(key,value) 向map设置一个值,已有键名的会被覆盖,否则会新建,返回设置后的map
  • get(key) 读取key对应的键值,没有则返回undefined
  • has(key) 查找map中有没有某个键名,返回Boolean
  • clear() 清楚所有成员,void

(3)遍历方法

和Set拥有同样的遍历方法

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()
for (let [key, value] of map) {
  console.log(key, value);
}
// "F" "no"
// "T" "yes"

map.forEach(function(value, key, map) {
  console.log("Key: %s, Value: %s", key, value);
});

你可能感兴趣的:(es6学习之Set和Map结构)