当前位置: 首页 > news >正文

一个简单的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" οnclick="testMap()">
</body>
</html>

  

相关文章:

  • Introduction to the Java Persistence API
  • 电脑开机后总是提示对话框:服务器正在运行中
  • hibernate第一天:环境搭建
  • 创建自己的yum源
  • hibernate第二天:hibernate原理
  • LINUX系统监控
  • hibernate第三天:O/R MAPPING常见框架
  • hadoop on nitrous.io
  • java常见日志理解
  • cobbler使用入门(未完整,待修改)
  • Externalizable和Serializable序列化与关键字transient
  • nmon系统监控工具
  • oracle官方文档使用
  • FlashBuilder(FB/eclipse) 打开多个无效
  • python 读写文件时,r、rt、rb、r+的区别
  • 【剑指offer】让抽象问题具体化
  • Apache Spark Streaming 使用实例
  • ES6系列(二)变量的解构赋值
  • JavaScript-Array类型
  • Java程序员幽默爆笑锦集
  • node入门
  • October CMS - 快速入门 9 Images And Galleries
  • PHP面试之三:MySQL数据库
  • SpiderData 2019年2月23日 DApp数据排行榜
  • Spring框架之我见(三)——IOC、AOP
  • vue.js框架原理浅析
  • 基于Android乐音识别(2)
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 扑朔迷离的属性和特性【彻底弄清】
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 译自由幺半群
  • 责任链模式的两种实现
  • 7行Python代码的人脸识别
  • #define,static,const,三种常量的区别
  • #大学#套接字
  • (3)llvm ir转换过程
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (安卓)跳转应用市场APP详情页的方式
  • (分布式缓存)Redis哨兵
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (五)Python 垃圾回收机制
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • .apk文件,IIS不支持下载解决
  • .NET 分布式技术比较
  • .net项目IIS、VS 附加进程调试
  • .Net转前端开发-启航篇,如何定制博客园主题
  • @CacheInvalidate(name = “xxx“, key = “#results.![a+b]“,multi = true)是什么意思
  • @DateTimeFormat 和 @JsonFormat 注解详解
  • [20180224]expdp query 写法问题.txt
  • [2019/05/17]解决springboot测试List接口时JSON传参异常
  • [Android] Implementation vs API dependency
  • [bzoj1901]: Zju2112 Dynamic Rankings
  • [c#基础]DataTable的Select方法
  • [C++] cout、wcout无法正常输出中文字符问题的深入调查(1):各种编译器测试
  • [Deep Learning] 神经网络基础