Set 数据结构
它类似于数组,但是成员的值都是唯一的,没有重复的值。
const mySet = new Set([1,2,1,2,1,2])
[...mySet] // [1,2]
mySet.size // 2 数据结构的长度,没有length属性
Set可以理解成数据去重的一种方法。
Set 实例的属性和方法
- Set.prototype.constructor:构造函数,默认就是Set函数。
- Set.prototype.size:返回Set实例的成员总
- Set.prototype.add(value):添加某个值,返回 Set 结构本身。
- Set.prototype.delete(value):删除某个值,返回一个布尔值,表示删除是否成功。
- Set.prototype.has(value):返回一个布尔值,表示该值是否为Set的成员。
- Set.prototype.clear():清除所有成员,没有返回值。
mySet.add(3).add(4).add(2);
[...mySet] // [1,2,3,4]
mySet.size // 4
mySet.has(1) // true
mySet.has(5) // false
mySet.delete(2,3);
[...mySet] // [1,4]
Array.from方法可以将 Set 结构转为数组。
const myArr = Array.from(mySet); // [1,4]
封装一种数组去重的方法
function dedupe(arr){
return Array.from(new Set(array));
}
dedupe([1,1,1,2,2,3]) // [1,2,3]
Set 结构的实例有四个遍历方法,可以用于遍历成员。
- Set.prototype.keys():返回键名的遍历器
- Set.prototype.values():返回键值的遍历器
- Set.prototype.entries():返回键值对的遍历器
- Set.prototype.forEach():使用回调函数遍历每个成员
keys(),values(),entries()
let set = new Set ([4,3,9,6]);
for(let item of set.keys()){
console.log(item);
}
// 4, 3, 9, 6
for(let item of set.values()){
console.log(item)
}
// 4, 3, 9, 6
for(let item of set.entries()){
console.log(item);
}
//[4,4] [3,3] [9,9] [6,6]
forEach() ,map() ,filter()
forEach()对每个成员执行某种操作,没有返回值。
set.forEach((val,key)=>{console.log(key + ':' + val)});
// 4 : 4, 3 : 3, 9 : 9, 6 : 6
数组的map和filter方法也可以间接用于 Set ,并且可以很容易地实现数据的并集、交集、差集。
let x = new Set ([2, 3, 4]);
let y = new Set ([4, 3, 1]);
let union = new Set([...x,...y]);
[...union] // [2, 3, 4, 1] 并集
let intersect = new Set([...x].filter(el => y.has(el)));
[...intersect] // [3, 4] 交集
let difference = new Set([...x].filter(el => !y.has(el)));
[...difference] // [2, 1] 差集
Map 数据结构
它类似于对象,但“键”的范围将不限于字符串。
let myMap = new Map();
let obj = {val : 'good'};
let arr = [1, 2, 3];
set() get() has() delete() clear() size
myMap.set(obj,'hello').set(arr,'world');
myMap.get(obj); // 'hello'
myMap.delete(obj) // true
myMap.has(obj) // false
myMap.size // 1
myMap.clear()
myMap.size // 0
Map 结构原生提供三个遍历器生成函数和一个遍历方法。
- Map.prototype.keys():返回键名的遍历器。
- Map.prototype.values():返回键值的遍历器。
- Map.prototype.entries():返回所有成员的遍历器。
- Map.prototype.forEach():遍历 Map 的所有成员。
let map = new Map([
['ADC', 'Uzi'],
['MID', 'Knight'],
['TOP', 'The Shy']
]);
for(let key of map.keys()){
console.log(key);
}
// 'ADC', 'MID', 'TOP'
for(let value of map.values()){
console.log(value);
}
// 'Uzi', 'Knight', 'The Shy'
for(let item of map.entries()){
console.log(item[0],item[1])
}
// 'ADC' : 'Uzi', 'MID' : 'Knight', 'TOP' : 'The Shy'
// 等同于使用 map.entries()
for(let [key,value] of map){
console.log(key,value);
}
结合数组的map方法、filter方法,可以实现 Map 的遍历和过滤(类似Set的map、filter使用方式)
与其他数据结构的互相转换
数组 转为 Map
let map = new Map([
['ADC', 'Uzi'],
['MID', 'Knight'],
['TOP', 'The Shy']
]);
Map 转为数组
使用扩展运算符(…)
[...map]
// [ ['ADC', 'Uzi'], ['MID', 'Knight'], ['TOP', 'The Shy'] ]
Map转为对象
function strMapToObject(value){
let obj = Object.create(null);
for(let [key,val] of value){
obj[key] = val;
}
return obj;
}
strMapToObject(map);
// { ADC: 'Uzi', MID: 'Knight', TOP: 'The Shy' }
对象转为 Map
Object.entries() 遍历对象
let obj = {x: 1, y: 2};
let toMap = new Map(Object.entries(obj));
// 或者是
function objectToMap(value){
let toMap = new Map();
for (let key of Object.keys(value)){
toMap.set(k,obj[k]);
}
return toMap;
}
objectToMap(obj); // Map{"x": 1, "y": 2}
Map 转为 JSON
function mapToJson(value){
return JSON.stringify([...value]);
}
let json = mapToJson(map); // {"ADC": "Uzi", "MID": "Knight", "TOP": "The Shy"}
JSON 转为 Map
function jsonToMap(json){
return objectToMap(JSON.parse(value));
}
jsonToMap(); // Map {'ADC' => "Uzi", 'MID' => "Knight", 'TOP' => "The Shy"}