ES6学习之JavaScript 的Set类集合

179 阅读3分钟

本文已参与[新人创作礼]活动,一起开启掘金创作之路。

JavaScript的Object类型是一种万能数据结构,可用于把字符串(对象的属性名)映射为任意值。当被映射的值是固定值(如true)时,对象实际上是一组字符串。

对象在JavaScript编程中经常被用作映射和集合,但却要受到对字符串约束的限制。另外,由于对象正常都会继承带名字(如toString)的属性,而这些属性明显也不是为映射和集合而准备的。 为此,ES6新增了真正的Set和Map类,接下来进行讨论。

Set类

声明Set类

gantt
title A Gantt Diagram
dateFormat  YYYY-MM-DD
section Section
A task           :a1, 2014-01-01, 30d
Another task     :after a1  , 20d
section Another
Task in sec      :2014-01-12  , 12d
another task      : 24d
let s = new Set()
let t = new Set([1,2,3,4,5])
let ss = new Set("Hello Tsg")
let a = new Set(ss)
// let so = new Set({id:1,name:"王钢蛋"}) // 对象不可以 Uncaught TypeError
console.log(t,a);

Set()构造函数的参数不一定是数组,但必须是一个可迭代对象(包括其他集合)

集合的size属性类似数组的length属性,保存着集合包含多少个值。

let mySet = new Set([2,4,6,8,10])
console.log(mySet.size); // => 5

集合不一定在创建时初始化,可以在创建之后再通过add()、delete()和clear()方法给它添加元素或从中删除元素。记住,集合不能包含重复的值,因此添加集合中已经存在的值没有效果:

add() 增加元素方法

let testSet = new Set([1,2,3,4,5])
console.log(testSet.size); // =>5

// 增加一个数值6
testSet.add(6)
console.log(testSet.size); // =>6

// 增加一个同样的数值 6 将不会发生变化
testSet.add(6)
console.log(testSet.size); // =>6 仍然是6

也可以增加不同的类型:

let testSet = new Set([1,2,3,4,5])
testSet.add(true) // 增加布尔值
testSet.add("Hello U") // 增加字符串
testSet.add({     // 增加对象
    id:1,
    name:"王钢蛋"
})	
console.log(testSet);

add()方法的链式写法

如果想给集合添加多个值,可以连缀调用add(),如s.add('a').add('b').add('c');。

let testSet = new Set([1,2,3,4,5])
testSet.add(6).add(7).add(8)
console.log(testSet.size); // => 8

delete() 删除元素方法

删除:delete()方法一次也只删除一个集合元素。不过,与add()不同,delete()返回一个布尔值。如果指定的值确实是一个集合成员,那么delete()删除它并返回true;否则,delete()什么也不做并返回false。

let testSet = new Set([1,2,3,4,5])
testSet.delete(5) // => true
console.log(testSet.size); // => 4
testSet.delete(5) // => false
console.log(testSet.size); // => 4

delete()方法,不支持链式操作:

let testSet = new Set([1,2,3,4,5])
testSet.delete(5).delete(4) // delete 不支持链式操作 Uncaught TypeError
testSet.delete(5).add(7) // delete 不支持链式操作 Uncaught TypeError

clear() 清空元素方法

清空集合:clear()

let testSet = new Set([1,2,3,4,5])
testSet.clear()
console.log(testSet.size); // => 0

使用集合时最重要的不是添加和删除元素,而是检查某个值是不是集合的成员。为此要使用has()方法,其返回布尔值:

let testSet = new Set([1,2,3,4,5])
console.log(testSet.has(2)); // => true
console.log(testSet.has(9)); // => false

循环枚举之for/of

Set类是可迭代的,这意味着可以使用for/of循环枚举集合的所有元素:

let sum = 0
for (let s of testSet) {
	sum+=s
}
console.log(sum); // => 15

循环枚举之forEach()

Set类也实现了一个forEach()方法,与数组的同名方法类似:

let testSet = new Set([1, 2, 3, 4, 5])
let a = 10
testSet.forEach(v => a *= v)
console.log(a); // 1200: 1*2*3*4*5*10