`
dh189
  • 浏览: 135335 次
  • 性别: Icon_minigender_2
  • 来自: 上海
社区版块
存档分类
最新评论

javascript 实现java中的Map (高效)

阅读更多
javascript实现java中的Map,代码是在国外的一个网站上看到的(http://stackoverflow.com/questions/368280/javascript-hashmap-equivalent),自己稍作了修改,之前也看到过有人用2个数组实现了Map,但是我感觉效率比较低,现在这个我感觉效率还可以,自己做了下测试,代码如下:
Map.js
function Map(linkItems) { 
    this.current = undefined; 
    this._size = 0; 
    if(linkItems === false){
    	this.disableLinking(); 
    } 
}
/**
 * 获取当前map
 * @return 当前对象
 */
Map.noop = function() { 
    return this; 
}; 
/**
 * 非法操作
 * @return
 */
Map.illegal = function() { 
    throw new Error("非法操作,Map已经被禁用"); 
}; 
/**
 * 
 * @param obj
 * @param foreignKeys
 * @return
 */
Map.from = function(obj, foreignKeys) { 
    var map = new Map; 
    for(var prop in obj) { 
        if(foreignKeys || obj.hasOwnProperty(prop)){
        	map.put(prop, obj[prop]); 
        } 
    } 
    return map; 
}; 
/**
 * 禁用map
 * @return
 */
Map.prototype.disableLinking = function() { 
    this.link = Map.noop; 
    this.unlink = Map.noop; 
    this.disableLinking = Map.noop; 
    this.next = Map.illegal; 
    this.key = Map.illegal; 
    this.value = Map.illegal; 
    this.clear = Map.illegal; 
    return this; 
}; 
/**
 * 返回hash值 例如:number 123
 * @param value key/value
 * @return
 */
Map.prototype.hash = function(value) { 
    return (typeof value) + ' ' + (value instanceof Object ? (value.__hash || (value.__hash = ++arguments.callee.current)) : value.toString()); 
}; 
/**
 * 返回map的长度
 * @return
 */
Map.prototype.size = function() { 
    return this._size;
}; 

Map.prototype.hash.current = 0; 
/**
 * 通过key获取value
 * @param key
 * @return
 */
Map.prototype.get = function(key) { 
    var item = this[this.hash(key)]; 
    return item === undefined ? undefined : item.value; 
}; 
/**
 * 向map中添加数据
 * @param key 键
 * @param value 值
 * @return
 */
Map.prototype.put = function(key, value) { 
    var hash = this.hash(key); 
    if(this[hash] === undefined) { 
        var item = { key : key, value : value }; 
        this[hash] = item; 
        this.link(item); 
        ++this._size; 
    }else{
    	this[hash].value = value;
    } 
    return this; 
}; 
/**
 * 通过key删除数据
 * @param key
 * @return
 */
Map.prototype.remove = function(key) { 
    var hash = this.hash(key); 
    var item = this[hash]; 
    if(item !== undefined) { 
        --this._size; 
        this.unlink(item); 
        delete this[hash]; 
    } 
    return this; 
}; 
/**
 * 清除map
 * @return
 */
Map.prototype.clear = function() { 
    while(this._size){
		this.remove(this.key()); 
	} 
    return this; 
}; 
/**
 * 处理队列
 * @param item
 * @return
 */
Map.prototype.link = function(item) { 
    if(this._size == 0) { 
        item.prev = item; 
        item.next = item; 
        this.current = item; 
    }else { 
        item.prev = this.current.prev; 
        item.prev.next = item; 
        item.next = this.current; 
        this.current.prev = item;
    } 
}; 
Map.prototype.unlink = function(item) { 
    if(this._size == 0){ 
        this.current = undefined;
    }else { 
        item.prev.next = item.next; 
        item.next.prev = item.prev; 
        if(item === this.current){
        	this.current = item.next; 
        } 
    } 
}; 
/**
 * 获取下一个
 * @return
 */
Map.prototype.next = function() { 
    this.current = this.current.next; 
    return this;
}; 
/**
 * 获取key
 * @return
 */
Map.prototype.key = function() { 
    return this.current.key; 
}; 
/**
 * 获取value
 * @return
 */
Map.prototype.value = function() { 
    return this.current.value; 
}; 

测试代码如下:
var l=10000;
	var map=new Map();
	var start=new Date().getTime();
	for(var i=0;i<l;i++){
		map.put("key_"+i,new Date());
	}
	var end=new Date().getTime();
	document.write("向map中添加了  "+l+" 个Date对象..........");
	document.write("<br/>");
	document.write("耗时  "+(end-start)+" 毫秒,map的长度为:"+map.size());
	document.write("<br/>");
	document.write("在map中提取全部数据..........");
	document.write("<br/>");
	start=new Date().getTime();
	for(var i=0;i<map.size();i++){
		map.get("key_"+i).getTime();
	}
	end=new Date().getTime();
	document.write("耗时  "+(end-start)+" 毫秒");
	document.write("<br/>");
	document.write("清空map..........");
	document.write("<br/>");
	start=new Date().getTime();
	map.clear();
	end=new Date().getTime();
	document.write("耗时  "+(end-start)+" 毫秒,map的长度为:"+map.size());
	document.write("<br/>");

测试结果如下:
1.IE7



2.Firefox 3.6.8



3.谷歌浏览器5.0



方法next的使用:
var map=new Map();
	map.put("key_1","value_1");
	map.put("key_2","value_2");
	map.put("key_3","value_3");
	var m=map.next();
	document.write("map.next:key="+m.key()+" value="+m.value());
	document.write("<br/>");
	m=map.next();
	document.write("map.next:key="+m.key()+" value="+m.value());

结果如下:
map.next:key=key_2 value=value_2
map.next:key=key_3 value=value_3 
  • 大小: 18.5 KB
  • 大小: 20.1 KB
  • 大小: 18.2 KB
分享到:
评论

相关推荐

    Java Map 遍历比较齐全的解析.docx

    在某些场景下,如果需要兼容JavaScript或者使用类似的方法,可能会使用`Object.keys(map).length`,但这是JavaScript中的写法,在Java中并不适用。 3. **Java 8及Lambda表达式遍历Map** 自Java 8开始,引入了...

    js仿java的map对象

    总结来说,为了在JavaScript中实现类似于Java Map的功能,我们可以选择自定义对象或使用ES6的Map数据结构。自定义对象简单易懂,适用于不涉及复杂操作的情况;而ES6的Map则提供了更为强大和标准的API,适用于大型...

    基于JavaScript和Java的电影院管理系统设计源码 - MyMovie

    本源码提供了一个基于JavaScript和Java的电影院管理系统的设计。项目包含2138个文件,其中包括954个JavaScript...该项目旨在为电影院提供高效的管理服务,通过JavaScript和Java技术实现,以提升用户体验和操作便捷性。

    不用第三方jar的json与object(map、list)互换java类

    在Java编程中,JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,常用于前后端数据传输。本文将深入探讨如何在不依赖第三方库的情况下,实现JSON与Java对象(如Map、List)之间的互换。我们将分析...

    js中模仿java的map使用

    根据提供的文件信息,本文将详细解释如何在JavaScript中模拟Java中的`Map`功能,并实现一组基本的操作方法。这种做法有助于理解两种语言之间处理键值对数据结构的不同方式,并且能够帮助开发者利用JavaScript来构建...

    ajax和json跟java实现List、Map直接传递

    在Web开发中,Ajax(Asynchronous JavaScript and XML)和JSON(JavaScript Object Notation)是两种常用的技术,用于实现页面的异步数据交互和数据传输。Java作为后端服务器语言,常与它们配合处理数据,尤其是当...

    基于JavaScript、Java、CSS的Java_web豪车租车信息管理系统设计源码

    本系统是一款基于JavaScript、Java和CSS的Java_web豪车租车信息管理系统源码,总计包含334个文件,其中包括176个JavaScript文件、80个Java文件、33个JSP文件、16个CSS文件、11个JPG文件、5个PNG文件、4个MAP文件、1...

    java 数据分页显示

    以上就是Java中实现数据分页显示的关键点,涉及数据库查询、参数传递、前端渲染等多个环节。实践中,我们需要结合具体的应用场景和性能需求,选择合适的方法和工具来实现高效、友好的分页功能。

    基于JavaScript和Java的学生宿舍管理系统设计源码

    本项目是基于JavaScript和Java的学生宿舍管理系统设计源码,包含320个文件,其中包括200个JavaScript文件、35个Java源文件、23个CSS样式文件、14个LESS样式文件、14个SCSS样式文件、11个MAP文件、4个HTML文件、2个...

    Java1.8API中文手册

    Java 8引入了Nashorn JavaScript引擎,允许Java程序直接执行JavaScript代码,实现Java和JavaScript之间的互操作。 十、Type注解 Java 1.8允许在类型上使用注解,增强了编译时和运行时的类型检查,如@NonNull用于...

    REST_JavaMap_Req_java_JSON_

    在这个特定的场景中,"REST_JavaMap_Req_java_JSON_" 提示我们讨论的是如何在Java中使用Map对象作为REST请求的数据模型,并通过JSON(JavaScript Object Notation)进行序列化和反序列化。JSON是一种轻量级的数据...

    基于JavaScript和Java的水产养殖物联网系统设计源码

    本设计源码提供了一个基于JavaScript和Java的水产养殖物联网系统,包含1171个文件,其中包括465个png图片文件,180个js脚本文件,以及179个xml配置文件。此外,还有95个css样式文件,77个java源文件,以及46个html...

    java各个Map的区别.doc

    Java 中的 Map 接口是集合框架的重要组成部分,它提供了键值对的存储方式。本文主要探讨了几个常见的 Map 实现类的区别,包括 ConcurrentHashMap、EnumMap 和 HashMap。 1. **ConcurrentHashMap**: 这是一个线程...

    Java8中文文档

    8. ** Nashorn JavaScript引擎**:Java 8集成了Nashorn JavaScript引擎,使得在Java应用中直接运行JavaScript代码成为可能,促进了Java和JavaScript之间的交互。 9. **类型注解**:Java 8允许在类型使用处(包括...

    jQuery的Ajax实现异步传输List、Map

    在Web开发中,jQuery是一个非常流行的JavaScript库,它极大地简化了DOM操作、事件处理和Ajax交互。Ajax(Asynchronous JavaScript and XML)技术允许我们在不刷新整个页面的情况下与服务器进行数据交换,极大地提升...

    基于Java和JavaScript的宿舍小卖铺管理系统设计源码 - shop-parent

    本源码提供了一个基于Java和JavaScript的宿舍小卖铺管理系统的设计。项目包含128个文件,其中包括78个Java...该项目旨在为宿舍提供一个高效的小卖铺管理系统,通过Java和JavaScript技术实现,以提升管理效率和准确性。

    基于JavaScript的Kafka-Map Web管理工具设计源码

    该项目是一款基于JavaScript的Kafka-Map Web管理工具源码,包含116个文件,涵盖50个Java源文件、24个React组件文件、14个PNG图片文件、5个JavaScript脚本文件、3个YAML配置文件,以及少量的HTML、Markdown、JSON、...

    json和map互转的标准化实现

    在编程领域,JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛用于服务器与客户端之间的...通过理解和应用这些知识,开发者可以有效地在Java项目中实现JSON与Map的互换,并保证数据的标准化表示。

    Java代码实现Map和Object互转及Map和Json互转

    在Java开发中,常常需要在Map和对象之间,以及Map和JSON之间进行转换。这样的转换在处理Web请求、数据存储和传输时非常常见。Java本身并没有提供直接的转换机制,但通过一些第三方库或反射机制,我们可以实现这些...

    java1.8api中文版

    8. ** Nashorn JavaScript引擎**:Java 8引入了一个新的脚本引擎Nashorn,允许在Java应用程序中直接运行JavaScript代码,实现了Java与JavaScript之间的交互。 9. **默认方法**:在接口中定义的默认方法允许不强制...

Global site tag (gtag.js) - Google Analytics