Set和Map数据结构
首先了解一下什么是构造函数
什么是构造函数?
“构造函数 ,是一种特殊的方法。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载。”简单地说构造函数是类函数,函数名与类名完全相同,无返回值。
什么是数据结构?
就是把相同的或者是不同的数据放在一起组合的称之为数据结构
SET
什么是Set?
Set本身就是一个构造函数,用来生成的Set数据结构,它类似于数组,但是值都是唯一的,没有重复的值,也就是说Set是唯一出现的,如果在一组数字里有重复数组有6位数[1,2,3,4,5,5]但是它只会返回其一5,不会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():清除所有成员,没有返回值。
循环遍历方法:
Set.prototype.keys():返回键名的遍历器
Set.prototype.values():返回键值的遍历器
Set.prototype.entries():返回键值对的遍历器
Set.prototype.forEach():使用回调函数遍历每个成员
Map
首先了解一下键值对
键值对(”key = value”)字符串,在开发中经常使用;
什么是Map?
Map是ES6提供的数据结构类似于对象,也就是键值对的集合
当对同只有一个对象的引用的时候Map结构才将其视为同一个键
Map 的键是一个简单类型的值(数字、字符串、布尔值),则只要两个值严格相等,Map 将其视为一个键,比如0和-0就是一个键,布尔值true和字符串true则是两个不同的键。另外,undefined和null也是两个不同的键。虽然NaN不严格相等于自身,但 Map 将其视为同一个键。
Map属性和操作方法
属性:
1.size属性
size属性返回 Map 结构的成员总数。
2.Map.prototype.set(key, value)
set方法设置键名key对应的键值为value,然后返回整个 Map 结构。如果key已经有值,则键值会被更新,否则就新生成该键。
const m = new Map();
m.set(‘edition’, 6) // 键是字符串
m.set(262, ‘standard’) // 键是数值
m.set(undefined, ‘nah’) // 键是 undefined
set方法返回的是当前的Map对象,因此可以采用链式写法。
3.Map.prototype.get(key)
get方法读取key对应的键值,如果找不到key,返回undefined。
4.Map.prototype.has(key)
has方法返回一个布尔值,表示某个键是否在当前 Map 对象之中。
5.Map.prototype.delete(key)
delete方法删除某个键,返回true。如果删除失败,返回false。
6.Map.prototype.clear()
clear方法清除所有成员,没有返回值。
遍历方法:
Map 结构原生提供三个遍历器生成函数和一个遍历方法。
Map.prototype.keys():返回键名的遍历器。
Map.prototype.values():返回键值的遍历器。
Map.prototype.entries():返回所有成员的遍历器。
Map.prototype.forEach():遍历 Map 的所有成员。
Map转为数组
Map 转为数组
前面已经提过,Map 转为数组最方便的方法,就是使用扩展运算符(…)。
const myMap = new Map()
.set(true, 7)
.set({foo: 3}, [‘abc’]);
[…myMap]
// [ [ true, 7 ], [ { foo: 3 }, [ ‘abc’ ] ] ]
数组转换为Map
将数组传入Map构造函数,就可以转换为Map。
new Map([
[true, 7],
[{foo: 3}, [‘abc’]]
])
// Map {
// true => 7,
// Object {foo: 3} => [‘abc’]
// }
Map转换对象
所有 Map 的键都是function strMapToObj(strMap) {
let obj = Object.create(null);
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 }
如果有非字符串的键名,那么这个键名会被转成字符串,再作为对象的键名。字符串,它可以无损地转为对象。
对象转为Map
function objToStrMap(obj) {
let strMap = new Map();
for (let k of Object.keys(obj)) {
strMap.set(k, obj[k]);
}
return strMap;
}
objToStrMap({yes: true, no: false})
// Map {“yes” => true, “no” => false}
Map 转为 JSON
Map 转为 JSON 要区分两种情况。一种情况是,Map 的键名都是字符串,这时可以选择转为对象 JSON。
function strMapToJson(strMap) {
return JSON.stringify(strMapToObj(strMap));
}
let myMap = new Map().set(‘yes’, true).set(‘no’, false);
strMapToJson(myMap)
// ‘{“yes”:true,“no”:false}’
另一种情况是,Map 的键名有非字符串,这时可以选择转为数组 JSON。
function mapToArrayJson(map) {
return JSON.stringify([…map]);
}
let myMap = new Map().set(true, 7).set({foo: 3}, [‘abc’]);
mapToArrayJson(myMap)
// ‘[[true,7],[{“foo”:3},[“abc”]]]’
JSON 转为 Map
JSON 转为 Map,正常情况下,所有键名都是字符串。
function jsonToStrMap(jsonStr) {
return objToStrMap(JSON.parse(jsonStr));
}
jsonToStrMap(’{“yes”: true, “no”: false}’)
// Map {‘yes’ => true, ‘no’ => false}
但是,有一种特殊情况,整个 JSON 就是一个数组,且每个数组成员本身,又是一个有两个成员的数组。这时,它可以一一对应地转为 Map。这往往是 Map 转为数组 JSON 的逆操作。
function jsonToMap(jsonStr) {
return new Map(JSON.parse(jsonStr));
}
jsonToMap(’[[true,7],[{“foo”:3},[“abc”]]]’)
// Map {true => 7, Object {foo: 3} => [‘abc’]}
等待更新。。。