网络编程
位置:首页>> 网络编程>> JavaScript>> 第一类工厂与哈希对象(2)

第一类工厂与哈希对象(2)

 来源:Ruby's Louvre 发布时间:2009-12-28 13:14:00 

标签:工厂,哈希,对象,mootools,JavaScript

哈希正是本文要说的,虽然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没什么好说的

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com