复制代码 代码如下:
//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 '#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();
// -> #
h.inspect();
// -> #
//注意这里会改变原来的hash对象
merge():
复制代码 代码如下:
var h = $h({ name: 'prototype', version: 1.5 });
h.merge({ version: 1.6, author: 'sam' }).inspect();
// -> #
h.inspect();
// -> #
//注意这里不改变原有hash对象