JS 实现 HashMap
HashMap代码(这种实现方式是错误的,错误原因:代码中_map、_length变量是HashMap的所有实例共用的):

/**
* HashMap
* 2021年09月09日
*/ (function (global) {
var _map;
var _length; global.HashMap = function () {
_map = {};
_length = 0;
}; global.HashMap.prototype = {
put: function (key, value) {
if (!_map.hasOwnProperty(key)) {
_length++;
}
_map[key] = value;
}, get: function (key) {
if (_map.hasOwnProperty(key)) {
return _map[key];
}
return null;
}, containsKey: function (key) {
return _map.hasOwnProperty(key);
}, size: function () {
return _length;
}, remove: function (key) {
if (_map.hasOwnProperty(key)) {
_length--;
return delete _map[key];
}
return false;
}, removeAll: function () {
_map = {};
}, keys: function () {
var keys = [];
for (var item in _map) {
keys.push(item);
}
return keys;
}, values: function () {
var values = [];
for (var item in _map) {
values.push(_map[item]);
}
return values;
}
}; global.HashMap.prototype.constructor = global.HashMap; })(window);
HashMap代码(正确的实现):

/**
* HashMap
* 2021年09月09日
*/ HashMap = function () {
this._length = 0;
this._map = {};
}; HashMap.prototype = {
put: function (key, value) {
if (!this._map.hasOwnProperty(key)) {
this._length++;
}
this._map[key] = value;
}, get: function (key) {
if (this._map.hasOwnProperty(key)) {
return this._map[key];
}
return null;
}, containsKey: function (key) {
return this._map.hasOwnProperty(key);
}, size: function () {
return this._length;
}, remove: function (key) {
if (this._map.hasOwnProperty(key)) {
this._length--;
return delete this._map[key];
}
return false;
}, removeAll: function () {
this._length = 0;
this._map = {};
}, keys: function () {
var keys = [];
for (var item in this._map) {
keys.push(item);
}
return keys;
}, values: function () {
var values = [];
for (var item in this._map) {
values.push(this._map[item]);
}
return values;
}
}; HashMap.prototype.constructor = HashMap;
测试代码:

<!DOCTYPE html>
<html>
<head>
<title>HashMap测试</title> <meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1"> <style type="text/css">
</style> <script type="text/javascript" src="jquery-1.7.1.js"></script>
<script type="text/javascript" src="hashmap.js"></script> </head>
<body>
<input type="button" value="测试1" onclick="testHashMap()" />
<input type="button" value="测试2" onclick="testArray()" />
<div id="div" style="height:800px;"></div> <script type="text/javascript">
var n = 100000;
var div = $("#div"); //测试数据
debugger;
var list = [];
var map = new HashMap();
for (var i = 1; i <= n; i++) {
var val = Math.floor(Math.random() * n);
var key = "key" + val; if (!map.containsKey(key)) {
map.put(key, val);
list.push({ key: key, value: val });
}
}
div.append("测试数据初始化完成,数据量:Array " + list.length + ",HashMap " + map.size() + "<br />"); //测试HashMap
function testHashMap() {
var t1 = new Date().getTime(); var sum = 0;
var count = 0;
for (var i = 20000; i <= 21000; i++) {
var key = "key" + i; if (map.containsKey(key)) {
var num = map.get(key);
count++;
sum += num;
}
} var t2 = new Date().getTime(); div.append("完成,结果:sum=" + sum + ",count=" + count + "耗时" + (t2 - t1).toString() + "毫秒<br />");
} //测试Array
function testArray() {
var t1 = new Date().getTime(); var sum = 0;
var count = 0;
for (var i = 20000; i <= 21000; i++) {
for (var k = 0; k < list.length; k++) {
var key = "key" + i;
var item = list[k]; if (item.key == key) {
count++;
sum += item.value;
}
}
} var t2 = new Date().getTime(); div.append("完成,结果:sum=" + sum + ",count=" + count + "耗时" + (t2 - t1).toString() + "毫秒<br />");
} </script>
</body>
</html>
JS 实现 HashMap的更多相关文章
- JS实现HashMap
/** * ********* 操作实例 ************** * var map = new HashMap(); * map.put("key1","Valu ...
- 学习Redis你必须了解的数据结构——HashMap实现
本文版权归博客园和作者吴双本人共同所有,转载和爬虫请注明原文链接博客园蜗牛 cnblogs.com\tdws . 首先提供一种获取hashCode的方法,是一种比较受欢迎的方式,该方法参照了一位园友的 ...
- JavaScript——HashMap实现
本文版权归博客园和作者吴双本人共同所有,转载和爬虫请注明原文链接博客园蜗牛 cnblogs.com\tdws . 首先提供一种获取hashCode的方法,是一种比较受欢迎的方式,该方法参照了一位园友的 ...
- 信息系统实践手记6-JS调用Flex的性能问题一例
说明:信息系统实践手记系列是系笔者在平时研发中先后遇到的大小的问题,也许朴实和细微,但往往却是经常遇到的问题.笔者对其中比较典型的加以收集,描述,归纳和分享. 摘要:此文描述了笔者接触过的部分信息系统 ...
- vue-cli +echarts-amap集成echarts和高德地图TypeError: Cannot read property 'dataToPoint' of null解决方案
由于项目的需求,需要做一种迁徙效果, 最后我们采用了组件化开发,可以说这个坑自己一个人踩,有点累,但也收获不少. vue-cli +echarts-amap集成echarts和高德地图,出现报错,错误 ...
- getparameter的使用
在做项目的过程中,会遇到跳转的页面,直接打开到里面的子项,这个时候,看了UI给我设计了四个页面,如果做四个页面,肯定是可以实现的.但是这个不符合前端的设计.就在想通过点击传值进去,肯定是能够获取到的. ...
- 2016-04-25-信息系统实践手记6-JS调用Flex的性能问题一例
layout: post title: 2016-04-25-信息系统实践手记6-JS调用Flex的性能问题一例 key: 20160425 tags: GIS JS FLEX 技术选型 性能 API ...
- JS hashMap实例详解
链接:http://www.jb51.net/article/85111.htm JS hashMap实例详解 作者:囧侠 字体:[增加 减小] 类型:转载 时间:2016-05-26我要评论 这篇文 ...
- js数组,数字函数,字符串函数,表单验证,hashMap,堆栈,日期函数,call函数
1.javascript的数组API Js代码 收藏代码 //定义数组 var pageIds = new Array(); pageIds.push('A'); 数组长度 pageIds.lengt ...
- js hashMap
/** * MAP对象,实现MAP功能 * * 接口: * size() 获取MAP元素个数 * isEmpty() 判断MAP是否为空 * clear() 删除MAP所有元素 * put(key, ...
随机推荐
- .NET8 Blazor新特性 流式渲染
什么是SSR Blazor中的流式渲染结合了SSR(服务端渲染),服务端将HTML拼好返回给前端,有点像我们熟知的Razor Pages 或 MVC . 当已经有了 Razor Pages 或 MVC ...
- MATLAB时间序列数据重建与平滑:HANTS滤波
本文介绍在MATLAB中,实现基于HANTS算法(时间序列谐波分析法)的长时间序列数据去噪.重建.填补的详细方法. HANTS(Harmonic Analysis of Time Series ...
- IDEA提示java_ 程序包org.apache.ibatis.session不存在
一.解决方案 1.问题原因: 这是因为配置Java的程序包这块出现了错误,同时可能你还没有设置让IDEA自动加载Jar包,才会报出这种错误的. 2.解决方案: 解决方式如下: File->Set ...
- Java中的try-catch
try里面放入可以尝试的操作,而catch则是接受try里面的异常,从而进行的操作,其目的是为了不让程序因为异常而中断,具体的流程是 抛出异常是可以自己设置,这里是自己设置的异常类fg,catch括号 ...
- Linux笔记03: Linux常用命令_3.1命令的基本格式
3.1命令的基本格式 3.1.1 命令提示符 [root@localhost ~]# 这就是Linux系统的命令提示符.各部分含义如下: ●[]:这是提示符的分隔符号,没有特殊含义. ●root:显示 ...
- [USACO2007NOVG] Telephone Wire G
题目描述 Farmer John's cows are getting restless about their poor telephone service; they want FJ to rep ...
- 基于.NET Core + Quartz.NET+ Vue + IView开箱即用的定时任务UI
前言 定时任务调度应该是平时业务开发中比较常见的需求,比如说微信文章定时发布.定时更新某一个业务状态.定时删除一些冗余数据等等.今天给大家推荐一个基于.NET Core + Quartz.NET + ...
- MyBatis的执行流程分析
核心流程介绍 我们都知道 MyBatis 是对 JDBC 的封装,不管怎样,JDBC 的那一套还是不会变的,只是做了抽象.封装.归类等:所以我们顺着 JDBC 的思路来说下MyBatis的执行流程,J ...
- ElasticSearch之cat indices API
命令样例如下: curl -X GET "https://localhost:9200/_cat/indices?v=true&pretty" --cacert $ES_H ...
- Python中的协程、线程和进程
一.协程与多线程和多进程一起使用有什么不同 协程.多线程和多进程都是实现程序并发执行的方法,不过它们在工作方式和适合的应用场景上存在一些区别. 1.协程(Coroutine) 协程是在单一线程 ...