您的位置:首页 > 理论基础 > 数据结构算法

ES6的数据结构set 和 map

2017-06-09 18:07 691 查看

ES6为我们提供了两个数据结构 set 和 map ,用他们来处理我们的数据有时候会很方便。话不多说直接分析这两个方法。

一、 set数据结构

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

Set内部判断两个值是否不同,类似于精确相等运算符(===),主要的区别是NaN等于自身,而精确相等运算符认为NaN不等于自身;另外,两个对象总是不相等的。

1.set的用法(剔除重复数据)

var ary = [1,2,3,4,4,3,2,1];
let set = new Set(ary);
console.log(set)  // [1,2,3,4]


2.set的属性

Set.prototype.constructor
set的构造函数默认是它本身

② Set.prototype.size 返回实例成员的总数。例如上边代码中

set.size  // 返回的为4


3.set类似于数组的一些增删改查的方法

add(value):添加某个值,返回Set结构本身。

delete(value):删除某个值,返回一个布尔值,表示删除是否成功。

has(value):返回一个布尔值,表示该值是否为Set的成员。

clear():清除所有成员,没有返回值。

可以使用for…of.. 去遍历set内部元素

例如:

ary = ["a","b","c","d"]
let set = new Set(ary);
set.add("e") // ["a","b","c","d","e"]
set.delete("a") // ["b","c","d","e"]
set.has("b") // true
set.clear() // []


使用for…of.. 去遍历set内部元素

var ary = ["a","b","c","d"];
let set = new Set(ary);
for(a of set){
console.log(a)
}
//结果:a b c d


4.对数据的一些遍历操作(不只是针对set,比如map同样可用)

keys():返回一个键名的遍历器

values():返回一个键值的遍历器

entries():返回一个键值对的遍历器

forEach():使用回调函数遍历每个成员

首先set数据中的键名和值是一样的,所以keys()方法和values()方法对set 来说效果是一样的

var ary = ["a","b","c","d"];
let set = new Set(ary);
console.log(set.keys()) //SetIterator {"a", "b", "c", "d"}
console.log(set.values()) //SetIterator {"a", "b", "c", "d"}
console.log(set.entries()) //SetIterator {["a", "a"], ["b", "b"], ["c", "c"], ["d", "d"]}


forEach():使用回调函数遍历每个成员(同样用于数组)

var ary = ["a","b","c","d"];
let set = new Set(ary);
set.forEach(function(key,value,obj){
console.log(key) // 遍历键
console.log(value) //遍历值(不过set的键和值是相同的)
console.log(obj) //返回遍历的对象
})


es6还提供了一个扩展数组的方法
...
同样可用于set


例如:

var ary = ["a","b","c","d"];
let set = new Set(ary);
console.log(set)  //Set {"a", "b", "c", "d"}
console.log([...set]) //["a", "b", "c", "d"]


这样我们数组去重就很简单的实现了:

var ary = ["a","b","c","d","c","a"];
let set = new Set(ary);
let newAry = [...set]
console.log(newAry)


5.set还可以实现合并集合,交叉集合。

例如:

①合并

var aryOne = ["a","b","c"];
var aryTwo = ["c","d","e"];
let setOne = new Set(aryOne);
let setTwo = new Set(aryTwo);
let newAry = new Set([...setOne,...setTwo]);
console.log([...newAry])


二、map数据结构

1、map在es6中也是一种数据结构,map我们在这里翻译过来不能够认为是地图,而是映射。这就很容易让我们理解,map可以将键值对映射为新的对象。也就是一种新的存储数据的方法。

2.map的使用方法:

①第一种

var obj = new Map();
obj.set("a",1);
obj.get(a)  // 1


②第二种

var obj = new Map([['name',"jhon"],["age",23]]);
obj.get("name") // jhon


我们在用map 处理数据的时候,他的键和值看似像是json的键值对,其实还是有区别的,map的键我们可以是任何数据,例如:

var obj = new Map();
//对象
let ob = {"name":"asd"}
obj.set(ob,"objcet")
console.log(obj.get(ob))
//number
obj.set(1,"number")
console.log(obj.get(1))
// null
obj.set(null,"null")
console.log(obj.get(null))
// underfind
obj.set(underfind,"underfind")
console.log(obj.get(underfind))


重点内容 需要注意的是:

①如果Map的键是一个简单类型的值(数字、字符串、布尔值),则只要两个值严格相等,Map将其视为一个键,包括0和-0。

②另外,虽然NaN不严格相等于自身,但Map将其视为同一个键。

3.map 的一些基本操作方法和上边的set 是一样的,我这里就不在啰嗦的讲一遍了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: