https://segmentfault.com/a/1190000008804891
类似于数组,但是没有重复值。
const s = new Set();
[2, 3, 5, 4, 5, 2, 2].forEach(x => s.add(x));
for(let i of s ) {
console.log(i); //2 3 5 4
}
var set = new Set([1, 2, 3, 4, 4]);
[...set]; // [1, 2, 3, 4]
可用于数组去重
[...new Set(array)]
Array.from()
方法可以将Set结构转换为数组Array.from(new Set(array))
let set = new Set();
let a = NaN;
let b = NaN;
set.add(a);
set.add(b);
set; //{NaN} 只能加入一个,说明Set内部两个NaN是相等的
属性:
Set.prototype.constructor
:构造函数,默认就是Set函数Set.prototype.size
:返回实例的成员总数操作方法(方法的具体实现见:我对JS集合的简单学习):
add(value)
:添加一个值,返回Set结构本身delete(value)
:删除某个值,返回布尔值has(value)
:返回布尔值,表示是否是成员clear()
:清除所有成员,无返回值s.add(1).add(2).add(2); //链式写法
s.size; //2
s.has(3); //false
s.delete(2);
s.has(2); //false
遍历方法
keys()
:返回键名的遍历器(Iterator)values()
:返回键值的遍历器entries()
:返回键值对的遍历器forEach()
:使用回调函数遍历每个成员这里要注意Set的键名和键值是同一个值,所以key()和values()行为是一致的。
let set = new Set(['red', 'green', 'no']);
for(let item of set.keys()) {
console.log(item); //red green no
}
for(let item of set.values()) {
console.log(item); //red green no
}
for(let item of set.entries()) {
console.log(item); //['red': 'red'] ['green': 'green'] ['no': 'no']
}
//对每个成员执行某种操作,参数依次为键值、键名、集合本身
new Set([1, 2, 3]).forEach((value, key) => console.log(value * 2)); //2 4 6
也可以直接遍历
let set = new Set([1, 4, 9]);
for(let item of set) {
console.log(item);//1 4 9
}
let a = new Set([1, 2, 3]);
let b = new Set([4, 3, 2]);
//并集
let union = new Set([...a, ...b]); //{1, 2, 3, 4}
//交集
let intersect = new Set([...a].filter(x => b.has(x))); //{2, 3}
//差集
let difference = new Set([...a].filter(x => !b.has(x))); //{1}
号外:扩展运算符(...)内部使用for...of循环
数组的map()
和filter()
可用于Set
let set = new Set([1, 2, 3]);
set = new Set([...set].map(x => x * 2)); //set: {2, 4, 6}
let set = new Set([1, 2, 3, 4, 5]);
set = new Set([...set].filter(x => (x % 2) == 0)); //set {2, 4}
JavaScript 的对象(Object),本质上是键值对的集合(Hash 结构),但是传统上只能用字符串当作键。ES6中的Map结构也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。
用法:new Map([iterable])
const map = new Map();
属性和方法
map
和filter
方法const map = new Map();
//添加键值对
map.set(1, 'aaa');
map.set(2, 'bbb').set('string', 'sssss');
map.get(1); // 'aaa'
map.size; // 3
//删除键值
map.delete(2);
map.has(2); //false
//遍历方法
for(let key of map.keys()){
console.log(key);
}
// 1
// 'string'
for(let key of map.values()){
console.log(key);
}
// 'aaa'
// 'sssss'
map.forEach(function(value, key, map){
console.log('key:'+key+', value:'+value)
})
// 'key:1, value:aaa'
// 'key:string, value:sssss'