ES6-MapES5模拟实现
时间:2022-07-25
本文章向大家介绍ES6-MapES5模拟实现,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
ES6-MapES5模拟实现
##ES6Map粗略介绍 ES6中Map具有以下特点:
- 任何值都可以存入Map当中,可以是function,undefined等
- 是一种新的数据结构
- 查询效率高
Map的主要原理
- 桶
- hash算法
- 链表查询
实现原来Map中的部分api
1.首先来创建我们自己的Map工厂,构建初始化函数
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获取一个临时的桶
myMap.prototype.getTempBucket = function(key){
let index = this.hash(key);
return this.bucket[index];
}
4.实现Map的存值方法,set
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.实现取值方法
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方法
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方法
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方法
myMap.prototype.clear= function(key){
//直接调用初始化的方法即可
this.init();
}
以上即为实现的相应方法
- linux中无 conio.h的解决办法
- 运用适配器模式应对项目中的变化
- 开车啦!小爬虫抓取今日头条街拍美女图
- C语言中随机数相关问题
- 算法决策兴起:人工智能时代的若干伦理问题及策略|AI观察
- Win10配置人工智能学习平台Tensorflow的正确姿势
- mysql left( right ) join使用on 与where 筛选的差异
- 一条长sql的排错过程
- (41) 剖析HashSet / 计算机程序的思维逻辑
- Python时间运算的详细机制初探讨
- C++编译错误cannot have cv-qualifier
- Python写TCP端口扫描工具之IP协议的讲解
- mac上nginx+jetty负载均衡部署一览
- Python标准库(1) — itertools模块
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 第六章 函数式编程
- 第七章 错误处理和资源管理
- 【赵渝强老师】MySQL的闪回
- 第八章 go单元测试--表格驱动测试, 性能测试
- 第八章--实际项目性能分析--pprof分析beego项目的性能
- 第八章 测试与性能调优--生成文档和测试示例代码
- 第九章 goroutine
- 第十一章 http标准库和其他标准库
- 第十一章 运用广度优先搜索走迷宫
- 第十三章 go实现分布式网络爬虫---单机版爬虫
- 第十五章 并发版爬虫第二版 -- 完结
- 第十六章 分布式爬虫--准备工作
- go 搭建并行处理管道
- 新一代基于大数据的管理信息系统(MIS)报表需求开发
- 3. docker-compose实战--ghost app