手写map
SelfMap.prototype.getHash = function (key) {//计算key的hash值
let hash = 0;
if (typeof (key) === 'string') {//String类型hash值
const seed = 31;
let len = key.length;
for (let i = 0; i < len; i++) {
hash = hash * seed + key.charCodeAt(i);
}
} else if (key !== null && typeof (key) === 'object') {//object类型的hash值
hash = this.getHash(key.toString());//调用toString将对象转换为字符串,再将字符串转换为hash值
} else {//Number、Boolean、null、undefined的hash值
hash = +key;
(hash + '' === 'NaN') && (hash = 0);
}
return hash;
}
SelfMap.prototype.set = function (key, value) {//{next:{key:'name',value:'德洛丽丝',next:{key:'age',value:30,next:null}}}
let site = this.getHash(key) % 8;
let lastNode = this.space[site];
let nextNode = this.space[site].next;
while (nextNode !== null) {
if (nextNode.key === key) {
nextNode.value = value;
break;//如果发现了相同的键,那么覆盖掉以前的value,然后直接跳出循环
} else {
lastNode = nextNode;
nextNode = nextNode.next;
}
}
!nextNode && (lastNode.next = { key: key, value: value, next: null });
}
SelfMap.prototype.get = function(key){
let site = this.getHash(key) % 8;
let nextNode = this.space[site].next;
while (nextNode !== null) {
if (nextNode.key === key) {
return nextNode.value;
} else {
nextNode = nextNode.next;
}
}
return undefined;
}
SelfMap.prototype.delete = function(key){
let site = this.getHash(key) % 8;
let lastNode = this.space[site];
let nextNode = this.space[site].next;
while (nextNode !== null) {
if (nextNode.key === key) {
nextNode.next === null ? lastNode.next = null : lastNode.next = nextNode.next;
//找到要删除的元素后,如果该元素中的next为null,则说明该元素本身位于最后一个,则可直接删除;否则将该元素位于中间,则将该元素的上一个元素中的next设为该元素中的next
break;
} else {
lastNode = nextNode;
nextNode = nextNode.next;
}
}
}
SelfMap.prototype.clear = function(){
let len = this.space.length;
for(let i = 0; i < len; i++){
this.space[i].next = null;
}
}
SelfMap.prototype.init = function () {//初始化函数,在new时创建一个桶
const bucketNum = 8;
this.space = [];
for (let i = 0; i < bucketNum; i++) {
this.space[i] = Object.create(null);
this.space[i].next = null;
}
}
function SelfMap() {
this.init();
}