第一类工厂与哈希对象(2)
来源:Ruby's Louvre 发布时间:2009-12-28 13:14:00
哈希正是本文要说的,虽然javascript的Object什么都是,但显然力不从心嘛,像mootools,Prototype与Base2都搞了一个Hash类,我觉得jQuery也应该有一个,起码它来构建jQuery.data比较爽一些。
var hash = dom.factory({ //支持多种创建方式 //[1]传入一个普通对象 //hash({ key: "val" }) ==> { key: "val" } //[2]传入两个参数,第一个必须是字符串 //hash("key", nasami) ==> { key: nasami } //[3]传入一个以逗号隔开的字符串 //hash("key,a,key2,b") ==> { key: "a", key2: "b" } //[4]传入一个以空白隔开的字符串 //hash(" key a key2 b") ==> { key: "a", key2: "b" } //[5]传入一个数组 //hash([aa,bb,cc]) ==> { 1:aa,2:bb,3:cc } init: function(obj) { var key = obj[0], value = obj[1], core = {}, i = 0; if(obj.length === 2){//如果有两个参数 core[key] = value; }else{ if(dom.isString(key)){ key = key.replace( /^\s+|\s+$/g, "");//进行trim操作 var arr = key.indexOf(",") !== -1 ? key.split(",") : key.split(/\s+/g); while ((value = arr[i++])) core[value] = arr[i++]; }else if(dom.isArray(key)){ for(var i= 0,n=key.length;i<n;i++) core[i] = key[i] }else{ core = key; } }; this.empty(); if(core) this.update(core); }, empty: function() { this._hash = {}; this.length = 0; return this; }, //用于初始化hash //把普通对象的键值利用put方法传入_hash中,不考虑其prototype的成员 update: function(obj) { for(var prop in obj) if(obj.hasOwnProperty(prop)) this.put(prop, obj[prop]); return this; }, contains: function(key) { return this.get(key) !== void(0); }, put: function(key, value) { if(!this.contains(key)) {//如果没包含则 this.length++; } this._hash[key] = value; return value; }, //取得相应的值 get: function(key) { return this._hash[key]; }, //移除一个键值对 remove: function(key) { delete this._hash[key]; this.length--; return this; }, //移除指定的键值对,并返回对应的值 pop: function(key) { var results = this.get(key); this.remove(key); return results; }, //取得所有的键,以数组形式返回 keys: function() { var keys = [],obj = this._hash; for(var prop in obj) if(obj.hasOwnProperty(prop)) keys.push(prop); return keys; }, //取得所有的值,以数组形式返回 values: function() { var values = [],obj = this._hash; for(var prop in obj) if(obj.hasOwnProperty(prop)) values.push(obj[prop]); return values; }, //取得所有的键值对,以数组形式返回 items: function() { var items = [],obj = this._hash; for(var prop in obj) if(obj.hasOwnProperty(prop)) items.push([prop, obj[prop]]); return items; }, //变成普通对象 toObject: function() { return this._hash; }, //仅当此键不存在时才添加, ensure: function(key, value) { var results = this.get(key); if(results === void(0)) return this.put(key, value); return results; }, forEach: function(fn, bind){ var pairs = this.items(); for(var i=0,n=pairs.length;i<n;i++){ fn.call(bind, pairs[i][1], pairs[i][0]); } }, map: function(fn, bind){ var results = hash({}); this.each(function(value, key){ results.put(key, fn.call(bind, value, key)); }); return results; }, filter: function(fn, bind){ var results = hash({}); this.each(function(value, key){ if (fn.call(bind, value, key)) results.put(key, value); }); return results; }, index: function(val) {//与get方法相反,取得其key var obj = this._hash; for(var prop in obj) if(obj.hasOwnProperty(prop) && obj[prop] === val) return prop; return null; }, toString:function(){ var pairs = this.items(),results = []; for(var i=0,n=pairs.length;i<n;i++){ results[i] = pairs[i][0]+":"+pairs[i][1] } return "{ "+results.join(", ")+" }"; }});hash.alias("forEach","each");hash.staticizeWithout();dom.hash = hash;
一些测试代码:
对于某些人看来,第一类工厂也有太过臃肿,为生成一个对象太劳师动众了(我一并写出来是为了方便我测试类工厂),下面是一个精简版。不需要类工厂,自行构建哈希,不过少了一些静态方法:
哈希对象 | |
---|---|
empty | 清空hash。 |
contains | 检测hash是否包含此键值对,参数为key |
put | 向hash增加一个键值对,参数两个,key与value |
get | 根据key取得相应的value |
remove | 根据key移除相应的键值对,返回修改后的hash |
pop | 根据key移除相应的键值对,返回被移除的value |
keys | 取得所有的键,以数组形式返回 |
values | 取得所有的值,以数组形式返回 |
items | 取得所有的键值对,以数组形式返回 |
toObject | 变成普通对象 |
ensure | 仅当此键不存在时才添加新的键值对 |
forEach或each | 类似Array.forEach,迭代执行传入函数 |
map | 类似Array.map,迭代执行传入函数,把执行结果放到一个新hash返回 |
filter | 类似Array.filter,迭代执行传入函数,把符合条件的键值对放到一个新hash返回 |
toString | 没什么好说的 |


猜你喜欢
- Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基
- mysql数据库自不必说,现在很多程序开发应用及站长们常用到,jdbc可能一般会比较陌生一些,jdbc是什么意思?这里也会提到,最主要的是为
- 本文实例讲述了Python实现发送与接收邮件的方法。分享给大家供大家参考,具体如下:一、发送邮件这里实现给网易邮箱发送邮件功能:import
- 本文实例讲述了Python装饰器。分享给大家供大家参考。具体分析如下:这是在Python学习小组上介绍的内容,现学现卖、多练习是好的学习方式
- python2.7安装opencv-python很慢且总是失败当直接使用pip安装opencv-python时,且总是报错,找了好久,发现是
- 下面是滚动条css代码参数介绍:scrollbar-3d-light-color 设置或检索滚动条亮边框颜色 scrollbar-highl
- 实例一--爬取页面import requestsurl="https//itemjd.com/2646846.html"
- 本文实例为大家分享了python实现微信消息防撤回的具体代码,供大家参考,具体内容如下使用了sqlite3保存数据,当有人撤回消息时取出数据
- 其实就是利用文件“global.asa”!许多ASP编程新手都想知道这东西是什么?事实上,global.asa就是一个事件驱动程序,其中共包
- 在asp中获取当前的地址栏网址很简单,使用下面这句语句即能实现获取网站域名Request.ServerVariables("HTT
- 导语在CSDN学习的过程中,遇到了爆火的文章是关于刮刮卡的!大家猜猜看是谁写的?我看这文章都特别火,我也感觉挺好玩的,那就寻思用 Pytho
- 一.应用场景多个组件共用一个方法时可以用 mixin 抽取到一个js文件中,作为共用方法二.实现方法1.提取js共用方法文件export c
- 本文实例讲述了SQL Server日期加减函数DATEDIFF与DATEADD用法。分享给大家供大家参考,具体如下:SQL Server 日
- 1. 错误描述之前在学习Python的过程中,导入自己写的包文件时,与之相关的方法等都会被划红线,但并不影响代码执行,如图:看着红线确实有点
- 一、什么是字典树在自然语言处理中,字符串集合常用字典树存储,这是一种字符串上的树形数据结构。字典树中每条边都对应一个字,从根节点往下的路径构
- 想大家都做过遮罩层这种常见的功能,css或jquery实现,实现方式多样化,这里http://我介绍我在项目中实现的方式,全屏遮罩,部分区域
- 前言django 的 admin 是个非常方便的admin portal,可以根据自己的需要重写.在使用Django自带的admin后台的时
- 什么是迭代器?迭代器是带有next方法的简单对象,当然也要实现__iter__函数。迭代器能在一序列的值上进行迭代,当没有可供迭代时,nex
- 不管是DRP中的分页查询代码的实现还是面试题中看到的关于分页查询的考察,都给我一个提示:分页查询是重要的。当数据量大的时候是必须考虑的。之前
- golang sort package: https://studygolang.com/articles/3360sort 操作的对象通常