|
这个对象相当于Java中的HashMap,当然了功能没HashMap那么强大。提供一直基本的方法,简单的方法就不在源码中注释了。
复制代码 代码如下: //Hash对象的工具函数 function $H(object) { return new Hash(object); };
var Hash = Class.create(Enumerable, (function() {
//初始化,创建一个新的Hash对象 function initialize(object) { this._object = Object.isHash(object) ? object.toObject() : Object.clone(object); }
//覆盖Enumerable里面的方法,遍历Hash对象时会用到 function _each(iterator) { for (var key in this._object) { var value = this._object[key], pair = [key, value]; pair.key = key; pair.value = value; iterator(pair); } }
function set(key, value) { return this._object[key] = value; }
function get(key) { if (this._object[key] !== Object.prototype[key]) return this._object[key]; }
function unset(key) { var value = this._object[key]; delete this._object[key]; return value; }
function toObject() { return Object.clone(this._object); }
function keys() { return this.pluck('key'); }
function values() { return this.pluck('value'); }
//返回value的key function index(value) { var match = this.detect(function(pair) { return pair.value === value; }); return match && match.key; }
function merge(object) { return this.clone().update(object); }
//更新原有Hash对象,把object参数内的键值对更新到原Hash对象 function update(object) { return new Hash(object).inject(this, function(result, pair) { result.set(pair.key, pair.value); return result; }); }
function toQueryPair(key, value) { if (Object.isUndefined(value)) return key; return key + '=' + encodeURIComponent(String.interpret(value)); }
function toQueryString() { return this.inject([], function(results, pair) { var key = encodeURIComponent(pair.key), values = pair.value;
if (values && typeof values == 'object') { if (Object.isArray(values)) return results.concat(values.map(toQueryPair.curry(key))); } else results.push(toQueryPair(key, values)); return results; }).join('&'); }
function inspect() { return '#<Hash:{' + this.map(function(pair) { return pair.map(Object.inspect).join(': '); }).join(', ') + '}>'; }
function toJSON() { return Object.toJSON(this.toObject()); }
function clone() { return new Hash(this); }
return { initialize: initialize, _each: _each, set: set, get: get, unset: unset, toObject: toObject, toTemplateReplacements: toObject, keys: keys, values: values, index: index, merge: merge, update: update, toQueryString: toQueryString, inspect: inspect, toJSON: toJSON, clone: clone }; })());
Hash.from = $H;
clone each get inspect keys merge remove set toJSON toObject toQueryString unset update value 给出一些方法的示例,简单的方法就略过了 toQueryString(): 复制代码 代码如下: $H({ action: 'ship', order_id: 123, fees: ['f1', 'f2'], 'label': 'a demo' }).toQueryString() // -> 'action=ship&order_id=123&fees=f1&fees=f2&label=a%20demo'
// an empty hash is an empty query string: $H().toQueryString() // -> ''
update(): 复制代码 代码如下: var h = $H({ name: 'Prototype', version: 1.5 }); h.update({ version: 1.6, author: 'Sam' }).inspect(); // -> #<Hash:{'name': 'Prototype', 'version': 1.6, 'author': 'Sam'}>
h.inspect(); // -> #<Hash:{'name': 'Prototype', 'version': 1.6, 'author': 'Sam'}>
//注意这里会改变原来的Hash对象
merge(): 复制代码 代码如下: var h = $H({ name: 'Prototype', version: 1.5 }); h.merge({ version: 1.6, author: 'Sam' }).inspect(); // -> #<Hash:{'name': 'Prototype', 'version': 1.6, 'author': 'Sam'}>
h.inspect(); // -> #<Hash:{'name': 'Prototype', 'version': 1.5}>
//注意这里不改变原有Hash对象
|
|