ES6-set和map数据结构

set

它类似于数组,但是成员的值都是唯一的,没有重复的值。Set 本身是一个构造函数,用来生成 Set 数据结构。

//Set()构造函数
let arr =[4,6,7,2,3,4,3,3,3,6,7,8,9]
let set =new Set(arr)
console.log(set)  // Set { 4, 6, 7, 2, 3, 8, 9 }

let set = new Set()
set.add(10)
set.add(20)
set.add(50)
set.add(10)//不能重复
console.log(set)  // Set { 10, 20, 50 }

上面代码通过add方法向Set结构加入成员,结果表明Set结构不会添加重复的值,可以实现数组的去重

let arr = [3, 5, 2, 2, 5, 5];
let unique = [...new Set(arr)];  // [3, 5, 2]

Set 结构的实例有以下属性:

1)Set.prototype.constructor:构造函数,默认就是Set函数。 2)Set.prototype.size:返回Set实例的成员总数。

Set 结构的实例有以下方法:

add(value)添加某个值,返回Set结构本身
delete(value)删除某个值,返回一个布尔值,表示删除是否成功
has(value)返回一个布尔值,表示该值是否为Set的成员
clear()清空set对象,没有返回值
keys()返回键名的遍历器
values()返回键值的遍历器
entries()返回键值对的遍历器(for in)
forEach()使用回调函数遍历每个成员
size获取成员个数
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);
s.has(2) // false

var items = new Set([1, 2, 3, 4, 5, 5, 5, 5]);
items.size   // 5

Set结构的实例有四个遍历方法,可以用于遍历成员。keys(),values(),entries(),forEach()

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"]
}

let set = new Set(['red', 'green', 'blue']);
let arr = [...set];  // ['red', 'green', 'blue']

可以省略values方法,直接用for...of循环遍历Set

let set = new Set(['red', 'green', 'blue']);

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

因此使用Set可以很容易地实现并集(Union)、交集(Intersect)和差集(Difference)。

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}

如果想在遍历操作中,同步改变原来的Set结构,目前没有直接的方法,但有两种变通方法。一种是利用原Set结构映射出一个新的结构,然后赋值给原来的Set结构;另一种是利用Array.from方法。

// 方法一
let set = new Set([1, 2, 3]);
set = new Set([...set].map(val => val * 2));
// set的值是2, 4, 6

// 方法二
let set = new Set([1, 2, 3]);
set = new Set(Array.from(set, val => val * 2));
// set的值是2, 4, 6

Map

ES6提供了Map数据结构。它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。也就是说,Object结构提供了“字符串—值”的对应,Map结构提供了“值—值”的对应,是一种更完善的Hash结构实现

//参数必须为数组,数组项也要为数组  map-->object
let map = new Map([['name','tom'],['age','12']])
// console.log(map) //Map { 'name' => 'tom', 'age' => '12' }

// map.set('gender','male')
// console.log(map.get('name')) //tom
// console.log(map) //Map { 'name' => 'tom', 'age' => '12', 'gender' => 'male' }
map.delete('age')
console.log(map) //Map { 'name' => 'tom' }
console.log(map.size)  //1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值