ES6-MapES5模拟实现
- Map的主要原理
- 实现原来Map中的部分api
##ES6Map粗略介绍 ES6中Map具有以下特点:
- 任何值都可以存入Map当中,可以是function,undefined等
- 是一种新的数据结构
- 查询效率高
Map的主要原理
- 桶
- hash算法
- 链表查询
实现原来Map中的部分api
1.首先来创建我们自己的Map工厂,构建初始化函数
代码语言:javascript复制 function myMap(){
this.bucketLength = 8;
this.init();
}
myMap.prototype.init = function(){
//创建一个长度为8的数组,也就是创建了8个桶
this.bucket = new Array(this.bucketLength);
}
- 实现hash算法 hash算法的实质为通过一些方程式将不确定的值转化为特定的值
//方法接收一个key值,根据key值返回一个特点的数
myMap.prototype.hash = function(key){
let hash = 0;
if(!(typeof key === "string")){
if(typeof key === "number"){
if(Object.is(key,NaN)){
hash = 0;
}else hash = key;
}else if(typeof key === "boolean"){
hash = 1;
}else if(typeof key === "object"){
hash = 2;
}else if(typeof key === "function"){
hash =3;
}else{//处理undefined
hash = 4;
}
}else{
//如果是string类型
for(var i = 0; i < 3; i ){
hash = key.charCodeAt(i);
}
}
return hash % 8;
}
3.根据key获取一个临时的桶
代码语言:javascript复制 myMap.prototype.getTempBucket = function(key){
let index = this.hash(key);
return this.bucket[index];
}
4.实现Map的存值方法,set
代码语言:javascript复制 myMap.prototype.set = function(key, value){
let tempBucket = this.getTempBucket(key);
//使用while循环去查找,如果找到了,就赋值,
while(tempBucket.next){
if(tempBucket.next.key == key){
tempBucket.next.value = value;
}else tempBucket.next = tempBucket.next.next;
}
//没找到就重新创建一个
tempBucket.next = {
key: key,
value: value,
next: null
}
}
5.实现取值方法
代码语言:javascript复制 myMap.prototype.get = function(key){
let tempBucket = this.getTempBucket(key);
while(tempBucket.next){
if(tempBucket.next.key == key){
return tempBucket.next.value;
}else tempBucket.next = tempBucket.next.next;
}
return undefined;
}
6.实现delete方法
代码语言:javascript复制 myMap.prototype.delete= function(key){
let tempBucket = this.getTempBucket(key);
while(tempBucket.next){
if(tempBucket.next.key == key){
tempBucket.next = tempBucket.next.next;
return true;
}else tempBucket.next = tempBucket.next.next;
}
return false;
}
7.实现has方法
代码语言:javascript复制 myMap.prototype.has= function(key){
let tempBucket = this.getTempBucket(key);
while(tempBucket.next){
if(tempBucket.next.key == key){
return true;
}else tempBucket.next = tempBucket.next.next;
}
return false;
}
7.实现clear方法
代码语言:javascript复制 myMap.prototype.clear= function(key){
//直接调用初始化的方法即可
this.init();
}
以上即为实现的相应方法