Hash

Hash是提供key/value的检索方式的容器.Prototype中的Hash是可以与Json相互转化的

//Create a Hash
var h=$H({name:'Prototype',version:1.5});
var h=new Hash({name:'Prototype',version:1.5});//两种方法创建Hash

//alert(h["version"]); //output "1.5final"

$H({action:'ship',order_id:123,fees:['fee1','fee2']}).toQueryString()
//->action=ship&order_id=123&fees=fee1&fees=fee2

注意Hash也有Enumerable的所有特性,以下是实现过程

Object.extend(Hash.prototype, Enumerable);

Object.extend(Hash.prototype, {
    _each: function(iterator) {
               for (var key in this) {
               var value = this[key];
               if (value && value == Hash.prototype[key]) continue;
               var pair = [key, value];
               pair.key = key;
               pair.value = value;
               iterator(pair);
       }
},
...

注意
正以为Hash有Enumerable特性,所以key 不能是each,_each之类的关键字

var h=newHash({...});
h['each']='my own stuff';
h.map();
//->errors out because'each'is not a function

toJson():转化为Json

each(itorate):类似Enumerable 但是itorate的参数是一个行如{key:theKey,value:theValue}的json

//继续第一个例子
h.each(function(pair){
    alert(pair.key+'="'+pair.value+'"');
});

//'name="Prototype"','version="1.5final"','author="SamStephenson"'

inspect():返回一个"奇怪"的字符串 参见Object.html

$H({name:'Prototype',version:1.5}).inspect()
//->"<#Hash:{name:'Prototype',version:1.5}>"//Order not guaranteed

keys()/values():返回关键子/值的数组

var h=$H({name:'Prototype',version:1.5});
h.keys().sort().join(',')
//->'name,version'

merge(hash):合并hash 若key冲突,则覆盖

var h=$H({name:'Prototype',version:1.5});
h.merge({version:'1.5final',author:'Sam Stephenson'});//覆盖了version
//-> 'name="Prototype"','version="1.5final"','author="Sam Stephenson"'

remove([,key...]):移除元素


varh=new Hash({a:'apple',b:'banana',c:'coconut'});
h.remove('a','c');//->['apple','coconut']
h.values()//->['banana']

toQueryString():可以生成行如 key1=value1&key2=value2的字符串,而且调用encodeURIComponent方法.非常适合Ajax提交

$H({action:'ship',order_id:123,fees:['f1','f2'],'label':'ademo'}).toQueryString()
//->'action=ship&order_id=123&fees=f1&fees=f2&label=a%20demo'

$H().toQueryString()//->''

也可以这么调用,跳过$H()
Hash.toQueryString({foo:'bar'})//->'foo=bar'