`
kylixs
  • 浏览: 66014 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

一个简单的JavaScript Map

阅读更多

用js写了一个Map,带遍历功能,请大家点评下啦。

//map.js

Array.prototype.remove = function(s) {
	for (var i = 0; i < this.length; i++) {
		if (s == this[i])
			this.splice(i, 1);
	}
}

/**
 * Simple Map
 * 
 * 
 * var m = new Map();
 * m.put('key','value');
 * ...
 * var s = "";
 * m.each(function(key,value,index){
 * 		s += index+":"+ key+"="+value+"\n";
 * });
 * alert(s);
 * 
 * @author dewitt
 * @date 2008-05-24
 */
function Map() {
	/** 存放键的数组(遍历用到) */
	this.keys = new Array();
	/** 存放数据 */
	this.data = new Object();
	
	/**
	 * 放入一个键值对
	 * @param {String} key
	 * @param {Object} value
	 */
	this.put = function(key, value) {
		if(this.data[key] == null){
			this.keys.push(key);
		}
		this.data[key] = value;
	};
	
	/**
	 * 获取某键对应的值
	 * @param {String} key
	 * @return {Object} value
	 */
	this.get = function(key) {
		return this.data[key];
	};
	
	/**
	 * 删除一个键值对
	 * @param {String} key
	 */
	this.remove = function(key) {
		this.keys.remove(key);
		this.data[key] = null;
	};
	
	/**
	 * 遍历Map,执行处理函数
	 * 
	 * @param {Function} 回调函数 function(key,value,index){..}
	 */
	this.each = function(fn){
		if(typeof fn != 'function'){
			return;
		}
		var len = this.keys.length;
		for(var i=0;i<len;i++){
			var k = this.keys[i];
			fn(k,this.data[k],i);
		}
	};
	
	/**
	 * 获取键值数组(类似Java的entrySet())
	 * @return 键值对象{key,value}的数组
	 */
	this.entrys = function() {
		var len = this.keys.length;
		var entrys = new Array(len);
		for (var i = 0; i < len; i++) {
			entrys[i] = {
				key : this.keys[i],
				value : this.data[i]
			};
		}
		return entrys;
	};
	
	/**
	 * 判断Map是否为空
	 */
	this.isEmpty = function() {
		return this.keys.length == 0;
	};
	
	/**
	 * 获取键值对数量
	 */
	this.size = function(){
		return this.keys.length;
	};
	
	/**
	 * 重写toString 
	 */
	this.toString = function(){
		var s = "{";
		for(var i=0;i<this.keys.length;i++,s+=','){
			var k = this.keys[i];
			s += k+"="+this.data[k];
		}
		s+="}";
		return s;
	};
}


function testMap(){
	var m = new Map();
	m.put('key1','Comtop');
	m.put('key2','南方电网');
	m.put('key3','景新花园');
	alert("init:"+m);
	
	m.put('key1','康拓普');
	alert("set key1:"+m);
	
	m.remove("key2");
	alert("remove key2: "+m);
	
	var s ="";
	m.each(function(key,value,index){
		s += index+":"+ key+"="+value+"\n";
	});
	alert(s);
}

 //testMap.htm

<html>
<head>
<title>Test Map</title>
<script language="javascript" src="map.js">
</script>
</head>
<body>
<input type="button" value="test" onclick="testMap()">
</body>
</html>

 

  • map.rar (1.2 KB)
  • 描述: javascript map source & testcase
  • 下载次数: 1160
分享到:
评论
41 楼 jiang2008 2008-11-06  
csf178 写道
kaipingk@gmail.com 写道
csf178 写道
楼上是不是有几位 什么语言都没用过Map的?
有些程序员一直到退休都不会写也没用过Map和Hashmap

你怎么知道人间一身都不会写也没用过啊!:)

我又不是神仙 只是猜一下而已 嘻嘻
因为我觉得你们说Js里面不需要Map很奇怪

我知道有很多程序员是这样的 喜欢硬编码 基本都不用Map这类高级排序或者查找结构的


你完全可以定义一个 对象保存键值对,这个对象保存到array中一样的效果。不用Map 就硬编码了,用Map就不硬编码了
40 楼 torycatkin 2008-06-17  
对于上面你的remove复杂度也太高了吧,完全不符合Map的原理
用我上面说的那个只要写
Map.prototype.remove = function(key){
   delete this[key];
};
39 楼 torycatkin 2008-06-17  
附加一句,你那样写的话和JS的Array对象基本没啥区别
38 楼 torycatkin 2008-06-17  
要写Map的话完全没必要这样做,只要自己写个原型就可以了,干嘛还要用Array
这样你的遍历就麻烦的要死了
function Map(){
};
Map.prototype.put = function(key,value){
    this[key] = value;
}
类似这样就可以了
37 楼 csf178 2008-06-14  
icewubin 写道
csf178 写道


第一点 扯上Java中默认实现的HashMap可不是我的事,我根本就不用Java
第二点 难道提到数据结构还要先烧香不成?

map在计算机领域跟associative array是一回事 不过Map多数时候都表示STL里的那种Map
至于您说的所谓通用结构 我可不知道是什么意思 建议您用计算机术语 这样比较准确 也易于理解

记得您老有看帖不仔细 还不知道别人说什么就开始回帖的习惯来的




1.我提到Java的HashMap只是给个参考,很多语言都会有HashMap,意思是指如果要实现HashMap请参考Java的HashMap实现算法,或者其他语言的实现。
Java是从楼主的注释中看出来的。

2.你说的“烧香”是什么意思呢?
我只是指出部分网友提到这次讨论的话题时用词不准确,不少关于HashMap的说法都是有问题的,但是言语间总有人会把Map和HashMap一起来说。


我怎么觉得是你没有仔细看我的帖和楼主的帖呢。
我是说关于Map这种数据结构大家的说法和相关的论点基本都没问题,但是不要和HashMap一起说。
我说的通用,就是希望他们不要在把Map和HashMap搞在一起,就是泛泛指Map这种数据结构,没有什么特殊意思,也不需要你理解。
我重点在说HashMap的问题,你怎么老和我讨论Map呢,我又不是否定Map的相关说法。

Map有很多种实现方式,HashMap只是其中的一种。
举个例子,比如讨论Map的速度时肯定会深入到具体的实现机制,HashMap就是读非常高速的结构。
当然不同的实现会让不同的Map在不同的应用场景表现出来的性能不一样,但是不能泛泛的说什么Map的性能相对的不好等等。

这样啊 有些误解 烧香是针对你说的轻描淡写地说数据解构说的

准确的说Map是个抽象数据类型 但是跟链表之类的不一样 它的数据结构不是确定的
36 楼 icewubin 2008-06-14  
楼主的Map代码是不是有bug?

    /**  
     * 获取键值数组(类似Java的entrySet())  
     * @return 键值对象{key,value}的数组  
      */  
    this.entrys = function() {   
        var len = this.keys.length;   
        var entrys = new Array(len);   
        for (var i = 0; i < len; i++) {   
            entrys[i] = {   
                key : this.keys[i],   
                value : this.data[i]//有bug?
            };   
        }   
        return entrys;   
    };


其中有一句是不是应该是:
value : this.data[this.keys[i]]
35 楼 icewubin 2008-06-14  
csf178 写道


第一点 扯上Java中默认实现的HashMap可不是我的事,我根本就不用Java
第二点 难道提到数据结构还要先烧香不成?

map在计算机领域跟associative array是一回事 不过Map多数时候都表示STL里的那种Map
至于您说的所谓通用结构 我可不知道是什么意思 建议您用计算机术语 这样比较准确 也易于理解

记得您老有看帖不仔细 还不知道别人说什么就开始回帖的习惯来的




1.我提到Java的HashMap只是给个参考,很多语言都会有HashMap,意思是指如果要实现HashMap请参考Java的HashMap实现算法,或者其他语言的实现。
Java是从楼主的注释中看出来的。

2.你说的“烧香”是什么意思呢?
我只是指出部分网友提到这次讨论的话题时用词不准确,不少关于HashMap的说法都是有问题的,但是言语间总有人会把Map和HashMap一起来说。


我怎么觉得是你没有仔细看我的帖和楼主的帖呢。
我是说关于Map这种数据结构大家的说法和相关的论点基本都没问题,但是不要和HashMap一起说。
我说的通用,就是希望他们不要在把Map和HashMap搞在一起,就是泛泛指Map这种数据结构,没有什么特殊意思,也不需要你理解。
我重点在说HashMap的问题,你怎么老和我讨论Map呢,我又不是否定Map的相关说法。

Map有很多种实现方式,HashMap只是其中的一种。
举个例子,比如讨论Map的速度时肯定会深入到具体的实现机制,HashMap就是读非常高速的结构。
当然不同的实现会让不同的Map在不同的应用场景表现出来的性能不一样,但是不能泛泛的说什么Map的性能相对的不好等等。
34 楼 csf178 2008-06-14  
icewubin 写道

我只是说了map是通用结构,不要动不动扯上Java中默认实现的HashMap,Java中的HashHap是利用Hash原理进行高速定位的。

不要很轻描淡写的说数据结构怎么怎么,基础知识,很多人都没掌握,高谈阔论的时候,概念混淆了都不知道。

第一点 扯上Java中默认实现的HashMap可不是我的事,我根本就不用Java
第二点 难道提到数据结构还要先烧香不成?

map在计算机领域跟associative array是一回事 不过Map多数时候都表示STL里的那种Map
至于您说的所谓通用结构 我可不知道是什么意思 建议您用计算机术语 这样比较准确 也易于理解

记得您老有看帖不仔细 还不知道别人说什么就开始回帖的习惯来的
33 楼 icewubin 2008-06-14  
csf177 写道
icewubin 写道
soni 写道
我知道我很菜,没看懂。
不过我想问几个问题:
1、实现这个map有啥用啊?实际项目中用于何处?
2、这个map里有什么功能是array和object无法提供的?
3、我不知道map、hashmap都是啥东西。感觉不就是提供了一些功能的容器么。弄出这么个东西来,速度不是要比直接用array和object慢么?


哈,你如果知道hash的意义,就不会说仅仅是提供了一些功能的容器了,建议你先补补hash的基础知识和原理。

不就是google里搜一下么,别偷懒,几分钟就能看出个大概了。

Yes 数据结构这种东西 不用当然也能写程序 只是合不合适的问题


我只是说了map是通用结构,不要动不动扯上Java中默认实现的HashMap,Java中的HashHap是利用Hash原理进行高速定位的。

不要很轻描淡写的说数据结构怎么怎么,基础知识,很多人都没掌握,高谈阔论的时候,概念混淆了都不知道。
32 楼 csf177 2008-06-13  
icewubin 写道
soni 写道
我知道我很菜,没看懂。
不过我想问几个问题:
1、实现这个map有啥用啊?实际项目中用于何处?
2、这个map里有什么功能是array和object无法提供的?
3、我不知道map、hashmap都是啥东西。感觉不就是提供了一些功能的容器么。弄出这么个东西来,速度不是要比直接用array和object慢么?


哈,你如果知道hash的意义,就不会说仅仅是提供了一些功能的容器了,建议你先补补hash的基础知识和原理。

不就是google里搜一下么,别偷懒,几分钟就能看出个大概了。

Yes 数据结构这种东西 不用当然也能写程序 只是合不合适的问题
31 楼 soni 2008-06-13  
搜了,看了。本质上不就是key和value的对应么。
map这个东西还是语言本身支持才行啊。
30 楼 soni 2008-06-13  
问题复杂化了。
HASH全称是“Hash House Harriers”(简称“Hash"、“HHH”,或“ 3H” ),是一项世界性的休闲活动,起源于1938年马来西亚的吉隆坡,如今在全世界184个国家几千个城市中都有开展,包括中国的北京、广州、上海、深圳、乌鲁木齐等城市。
29 楼 icewubin 2008-06-13  
soni 写道
我知道我很菜,没看懂。
不过我想问几个问题:
1、实现这个map有啥用啊?实际项目中用于何处?
2、这个map里有什么功能是array和object无法提供的?
3、我不知道map、hashmap都是啥东西。感觉不就是提供了一些功能的容器么。弄出这么个东西来,速度不是要比直接用array和object慢么?


哈,你如果知道hash的意义,就不会说仅仅是提供了一些功能的容器了,建议你先补补hash的基础知识和原理。

不就是google里搜一下么,别偷懒,几分钟就能看出个大概了。
28 楼 icewubin 2008-06-13  
csf177 写道
icewubin 写道
cyan19851224 写道
Array本来就是一个 hashmap

可以这样使用 var list = new Array();

list[sKey] = sValue


hashmap?知道什么叫hash么?

这里只不过是JS的关联数组而已。

建议看看Java的HashMap的实现代码吧。

var list = new Array();
list[sKey] = sValue

这哪是关联数组啊 这不就是数组么


我还以为他说的是对象模拟数组,所以说了关联数组,sorry。

不过这段list[sKey] = sValue;是跑不通的吧。普通对象可以模拟数组对象,数组对象不可以模拟普通对象的吧。

应该这么说:普通对象像个map,数组不像,更不是hashmap。
27 楼 soni 2008-06-13  
我知道我很菜,没看懂。
不过我想问几个问题:
1、实现这个map有啥用啊?实际项目中用于何处?
2、这个map里有什么功能是array和object无法提供的?
3、我不知道map、hashmap都是啥东西。不就是提供了一些关联key和value的功能的容器么。弄出这么个东西来,速度不是要比直接用array和object慢么?
26 楼 csf177 2008-06-12  
soni 写道
其实我都不知道啥叫map

你可以参看一下C++里STL的Map
Map可以不严格地认为是可以以任何类型做索引的数组
25 楼 soni 2008-06-12  
其实我都不知道啥叫map
24 楼 csf177 2008-06-12  
icewubin 写道
cyan19851224 写道
Array本来就是一个 hashmap

可以这样使用 var list = new Array();

list[sKey] = sValue


hashmap?知道什么叫hash么?

这里只不过是JS的关联数组而已。

建议看看Java的HashMap的实现代码吧。

var list = new Array();
list[sKey] = sValue

这哪是关联数组啊 这不就是数组么
23 楼 icewubin 2008-06-12  
cyan19851224 写道
Array本来就是一个 hashmap

可以这样使用 var list = new Array();

list[sKey] = sValue


hashmap?知道什么叫hash么?

这里只不过是JS的关联数组而已。

建议看看Java的HashMap的实现代码吧。
22 楼 csf178 2008-06-01  
kaipingk@gmail.com 写道
csf178 写道
kaipingk@gmail.com 写道
csf178 写道
楼上是不是有几位 什么语言都没用过Map的?
有些程序员一直到退休都不会写也没用过Map和Hashmap

你怎么知道人间一身都不会写也没用过啊!:)

我又不是神仙 只是猜一下而已 嘻嘻
因为我觉得你们说Js里面不需要Map很奇怪

我知道有很多程序员是这样的 喜欢硬编码 基本都不用Map这类高级排序或者查找结构的



不是js不需要用map,而是不需要像他那样花费那么多代码心血写的那个map,如果说他练习写map写昨玩耍,也是体力型的玩耍,体现不出map的本质。所以随便弄个{}不就满足需求的嘛,何必搞那么复杂呢!
况且他这个map也只能用string作key吧,换个obj做key就不行!

有理

相关推荐

    JavaScript实现Array(数组)和Map

    如果需要保持元素的顺序并且键总是数字,那么Array是一个好选择。但如果键可以是任意值,并且需要高效地查找或删除键值对,那么Map更为合适。熟练掌握这两种数据结构的用法,能帮助我们编写更高效、更易维护的...

    javascript Map对象 原型 插件

    javascript Map原型,对象,实现javascript中的Map数据类型功能

    gmap.rar_GMAP_javascript_map_map javascript_map offline

    在描述中,“高人把google map的javascript全部下载下来 可以实现大部分功能 离线使用GOOGLEMAP”,说明了这是一个高手编写的程序,他或她已经将Google Maps的JavaScript库进行了本地化处理,使得开发者可以在没有...

    自定义javascript的Map类

    自定义javascript的Map类,使用习惯完全依据于java的map使用习惯编写,java中map的用法基本一样,导入包即可使用

    javascript map类

    javascript map类。类中有相应demo,在javascript中实现Map的一个类,包括map中对应的一些数据结构相关算法。

    javascript 中Map的使用

    - 使用数组的解构赋值,每个数组元素是一个包含两个元素的数组,分别代表键和值,如`let map = new Map([['key1', 'value1'], ['key2', 'value2']]);` 2. 存取数据: - `set(key, value)`:设置键值对。 - `get...

    利用js实现Map

    下面是一个简单的`Map`实现示例: ```javascript class SimpleMap { constructor() { this.store = []; } set(key, value) { let pair = this.findPair(key); if (pair) { pair.value = value; } else { ...

    javascript(map功能)

    * size() 获取MAP元素个数 * isEmpty() 判断MAP是否为空 * clear() 删除MAP所有元素 * put(key, value) 向MAP中增加元素(key, value) * remove(key) 删除指定KEY的元素,成功返回True,失败返回False * ...

    在JavaScript中实现map对象

    通过上述实现,我们成功地利用JavaScript中的数组模拟了一个简单的Map对象。这种方式不仅加深了我们对Map这种数据结构的理解,同时也提供了一种灵活的方式来处理键值对数据。虽然ES6已经提供了内置的`Map`构造函数,...

    JavaScript 实现Array(数组)和Map

    在`map.js`文件中,可能会有对Map的实现或扩展,比如添加一个`forEach`方法遍历Map的所有键值对,或者一个`size`属性获取Map中的元素数量。 `object.js`文件可能包含与Object相关的辅助函数,比如深拷贝、属性检查...

    js模拟list和map

    javascript 模拟 java中的 List,Map js文件为 js/utils.js IE6.0 测试通过 &lt;br&gt;List: add(var obj) //添加一个元素 remove(var index) //删除一个元素 get(var index) //获取一个元素 remove...

    javascript的Map实现(高性能)

    在JavaScript中,`Map`是一种内置的数据结构,用于存储键值对。相比于对象,`Map`的优势在于它可以使用任何类型的值作为键,包括对象。在本文中,我们将深入探讨一种高性能的JavaScript `Map`实现,它基于JSON,具有...

    谷歌MAP_V3中文详解以及一个简单例子

    本教程将对谷歌地图API V3进行深入的中文解析,并提供一个简单的示例来帮助理解其基本用法。 首先,我们要了解如何引入谷歌地图API。在HTML文件中,我们需要在`&lt;head&gt;`标签内添加一个`&lt;script&gt;`标签,指定API的URL...

    map-example.zip_html5_javascript_map

    在本项目中,“map-example.zip_html5_javascript_map”是一个包含使用HTML5和JavaScript实现的网页动态地图的压缩包。这个项目旨在展示如何利用这两种技术创建交互式地图应用,为用户提供丰富的地理信息可视化体验...

    用javaScript实现的map,经过测试,很好用

    首先,创建一个Map对象非常简单,可以通过调用Map构造函数并传入可迭代对象(如数组)来初始化: ```javascript let map = new Map([[1, 'one'], [2, 'two']]); ``` Map对象提供了多种方法来操作和访问数据: 1. ...

    javascript map()方法解析

    下面是一个简单的例子,我们有一个包含平方数的数组`array1`,我们使用`map()`方法将每个元素乘以2: ```javascript const array1 = [1, 4, 9, 16]; // pass a function to map const map1 = array1.map(x =&gt; x * 2...

    JavaScript Array map.docx

    在JavaScript中,`Array.prototype.map()` 是一种非常实用的方法,用于创建一个新数组,其结果是调用提供的函数处理原数组的每一个元素。此方法不改变原数组,而是返回一个新的数组。 #### 二、基本用法与定义 `...

    一个简单的google map例子代码

    下面,我们将深入探讨如何利用Google Map API创建一个简单的地图应用,通过输入地名实现定位。 首先,我们需要了解Google Maps JavaScript API,它是实现地图功能的核心。这个API允许开发者在网页或Web应用中嵌入...

    一个简单的JavaScript Map实例(分享)

    然而,这个示例提供了一个自定义的Map实现,它在ES6 Map之前可能是很有用的。 自定义的Map类有以下几个核心方法: 1. `put(key, value)`:这个方法用于添加一个新的键值对。如果键不存在于Map中,它会被添加到`...

    js遍历map javaScript遍历map的简单实现

    在内容部分,作者提供了一个简单的JavaScript代码示例来展示如何遍历Map对象。示例中创建了一个Map对象,然后通过for...in循环来遍历该对象的键值对,并打印输出。具体代码如下: ```javascript var map = { "name...

Global site tag (gtag.js) - Google Analytics