Set 数据结构
Set 数据结构的介绍
在ES6中 提供了 新的数据结构 Set。虽然Set 类似于数组,但是成员的值都是唯一的,没有重复的值。
Set 的用处有很多。eg: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() :清除所有成员,没有返回值。
遍历操作
Set 结构的实例有四个遍历方法,可以用于遍历成员。
Set.prototype.keys() :返回键名的遍历器Set.prototype.values() :返回键值的遍历器Set.prototype.entries() :返回键值对的遍历器Set.prototype.forEach() :使用回调函数遍历每个成员
Set的集合
let set=new Set();
let set1=new Set([1,2,3
onsole.log(set1,size);
set1.add(7);
set1.delete(1);
console.log(set1.has(2)
set1.clear();
for(let v of set1){
console.log(v);
}
keys() ,values() ,entries()
keys 方法、values 方法、entries 方法返回的都是遍历器对象。因为 Set 结构没有键名,只有键值(换一种说法就是键名和键值是同一个值),因此keys 方法和values 方法的行为是完全一致。
let set = new Set(['one', 'two', 'three']);
for (let item of set.keys()) {
console.log(item);
}
for (let item of set.values()) {
console.log(item);
}
for (let item of set.entries()) {
console.log(item);
}
Set集合实践
// Set集合实践
let res=[...new Set(arr)];
// Set交集
let arr1=[6,5,4,3,2,1];
let res=[...new Set(arr)].filter(item=>{
let s=new Set(arr1);
if(s.has(item)){
return true;
}
else{
return false;
}
});
let res1=[...new Set(arr)].filter(item=>new Set(arr1).has(item));
console.log(res1);
//Set并集
let union=[...new Set(...arr,...arr1)];
console.log(union);
//Set差集
let diff=[...new Set(arr)].filter(item=>!(new Set(arr1).has(item)));
console.log(diff);
Map数据结构
JavaScript 的对象(Object),实质上是键值对的集合(Hash 结构),但是传统上只能用字符串当作键。这给它的使用带来了非常大的限制。
在ES6 中提供了 Map 数据结构。
它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。(更方便使用,不但字符串可以作为’键‘,其他各种类型的值都可以作为‘键’。)
意思就是说,Object 结构提供了“字符串—值”的对应,Map 结构提供了“值—值”的对应,是一种更完善的 Hash 结构实现。
假如你需要“键值对”的数据结构,Map 比 Object 更合适。(也更实用)
此代码使用了Map结构的set方法。声明Map对象,使用set方法添加上元素,输出元素的数量,可以获取元素,可以直接清空元素,还可以使用for of 来进行遍历操作,非常实用。
//声明一个 Map对象
let map=new Map();
// 添加元素
map.set("小茗同学","饮料");
map.set("change",function(){
console.log("生而平凡,但不甘平凡");
})
//输出数量size
console.log("map.size");
//删除元素
map.delete("change");
//获取需要的元素
console.log(map.get("change"));
// 清空所有的元素
map.clear();
//for of 遍历元素
for(let v of map){
console.log(v);
}
Map 的键实际上是跟内存地址绑定的,只要内存地址不一样,就视为两个键。
这就解决了同名属性碰撞(clash)的问题,我们扩展别人的库的时候,如果使用对象作为键名,就不用担心自己的属性与原作者的属性同名。(可以更好的使用,不会出现同名属性碰撞的问题)
如果 Map 的键是一个简单类型的值(数字、字符串、布尔值),则只要两个值严格相等,Map 将其视为一个键,比如0 和-0 就是一个键,布尔值true 和字符串true 则是两个不同的键。
另外,undefined 和null 也是两个不同的键。虽然NaN 不严格相等于自身,但 Map 将其视为同一个键。
遍历方法
Map 结构原生提供三个遍历器生成函数和一个遍历方法。
Map.prototype.keys() :返回键名的遍历器。Map.prototype.values() :返回键值的遍历器。Map.prototype.entries() :返回所有成员的遍历器。Map.prototype.forEach() :遍历 Map 的所有成员。
|