Set
ES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。
Set
本身是一个构造函数,用来生成 Set 数据结构。
Set 实例的属性和方法
Set 结构的实例有以下属性。
Set.prototype.constructor
:构造函数,默认就是Set
函数。Set.prototype.size
:返回Set
实例的成员总数。
Set 实例的方法分为两大类:操作方法(用于操作数据)和遍历方法(用于遍历成员)。下面先介绍四个操作方法。
Set.prototype.add(value)
:添加某个值,返回 Set 结构本身。Set.prototype.delete(value)
:删除某个值,返回一个布尔值,表示删除是否成功。Set.prototype.has(value)
:返回一个布尔值,表示该值是否为Set
的成员。Set.prototype.clear()
:清除所有成员,没有返回值。
let set = new Set();
set.add("abc");
set.add("abc");
上面代码通过add()
方法向 Set 结构加入成员,结果表明 Set 结构不会添加重复的值。
遍历操作
Set 结构的实例有四个遍历方法,可以用于遍历成员。
Set.prototype.keys()
:返回键名的遍历器Set.prototype.values()
:返回键值的遍历器Set.prototype.entries()
:返回键值对的遍历器Set.prototype.forEach()
:使用回调函数遍历每个成员
let set = new Set(['aaa', 'bbb']);
for (let item of set.keys()) {
console.log(item);
}
//aaa
//bbb
遍历的应用
扩展运算符(...
)和 Set 结构相结合,就可以去除数组的重复成员。
let arr = [1, 2, 2, 3, 5, 5];
let unique = [...new Set(arr)];
// [1, 2, 3,5]
Map
JavaScript 的对象(Object),本质上是键值对的集合(Hash 结构),但是传统上只能用字符串当作键。这给它的使用带来了很大的限制。map类似对象的类型 key支持任意类型。
let a = {"name":"张三"};
const myMap = new Map();
myMap.set(a,"死刑");
console.log(strMapToObj(myMap));
//{ '[object Object]': '死刑' }
实例的属性和操作方法
size
属性返回 Map 结构的成员总数。set
方法设置键名key
对应的键值为value
,然后返回整个 Map 结构。如果key
已经有值,则键值会被更新,否则就新生成该键。get
方法读取key
对应的键值,如果找不到key
,返回undefined
。has
方法返回一个布尔值,表示某个键是否在当前 Map 对象之中。delete
方法删除某个键,返回true
。如果删除失败,返回false
。clear
方法清除所有成员,没有返回值。
const myMap = new Map()
.set('yes', true)
.set('no', false);
console.log(strMapToObj(myMap));
// { yes: true, no: false }
遍历方法
Map 结构原生提供三个遍历器生成函数和一个遍历方法。
Map.prototype.keys()
:返回键名的遍历器。Map.prototype.values()
:返回键值的遍历器。Map.prototype.entries()
:返回所有成员的遍历器。Map.prototype.forEach()
:遍历 Map 的所有成员。
let a = {"name":"张三"};
const myMap = new Map();
myMap.set(a,"死刑");
for (let key of myMap.keys()) {
console.log(key);
//{ name: '张三' }
}
Map 转为数组
Map 转为数组最方便的方法,就是使用扩展运算符(...
)。
let a = {"name":"张三"};
const myMap = new Map();
myMap.set(a,"死刑");
console.log([...myMap]);
Map 转为对象 如果所有 Map 的键都是字符串,它可以无损地转为对象。
function strMapToObj(strMap) {
let obj = {};
for (let [k,v] of strMap) {
obj[k] = v;
}
return obj;
}
const myMap = new Map()
.set('yes', true)
.set('no', false);
strMapToObj(myMap)
// { yes: true, no: false }
如果有非字符串的键名,那么这个键名会被转成字符串,再作为对象的键名。