92 lines
2.2 KiB
JavaScript
92 lines
2.2 KiB
JavaScript
|
var Hash = function(obj) {
|
||
|
Object.extend(this, obj || {});
|
||
|
};
|
||
|
|
||
|
Object.extend(Hash, {
|
||
|
toQueryString: function(obj) {
|
||
|
var parts = [];
|
||
|
|
||
|
this.prototype._each.call(obj, function(pair) {
|
||
|
if (!pair.key) return;
|
||
|
|
||
|
if (pair.value && pair.value.constructor == Array) {
|
||
|
var values = pair.value.compact();
|
||
|
if (values.length < 2) pair.value = values.reduce();
|
||
|
else {
|
||
|
key = encodeURIComponent(pair.key);
|
||
|
values.each(function(value) {
|
||
|
value = value != undefined ? encodeURIComponent(value) : '';
|
||
|
parts.push(key + '=' + encodeURIComponent(value));
|
||
|
});
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
if (pair.value == undefined) pair[1] = '';
|
||
|
parts.push(pair.map(encodeURIComponent).join('='));
|
||
|
});
|
||
|
|
||
|
return parts.join('&');
|
||
|
}
|
||
|
});
|
||
|
|
||
|
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);
|
||
|
}
|
||
|
},
|
||
|
|
||
|
keys: function() {
|
||
|
return this.pluck('key');
|
||
|
},
|
||
|
|
||
|
values: function() {
|
||
|
return this.pluck('value');
|
||
|
},
|
||
|
|
||
|
merge: function(hash) {
|
||
|
return $H(hash).inject(this, function(mergedHash, pair) {
|
||
|
mergedHash[pair.key] = pair.value;
|
||
|
return mergedHash;
|
||
|
});
|
||
|
},
|
||
|
|
||
|
remove: function() {
|
||
|
var result;
|
||
|
for(var i = 0, length = arguments.length; i < length; i++) {
|
||
|
var value = this[arguments[i]];
|
||
|
if (value !== undefined){
|
||
|
if (result === undefined) result = value;
|
||
|
else {
|
||
|
if (result.constructor != Array) result = [result];
|
||
|
result.push(value)
|
||
|
}
|
||
|
}
|
||
|
delete this[arguments[i]];
|
||
|
}
|
||
|
return result;
|
||
|
},
|
||
|
|
||
|
toQueryString: function() {
|
||
|
return Hash.toQueryString(this);
|
||
|
},
|
||
|
|
||
|
inspect: function() {
|
||
|
return '#<Hash:{' + this.map(function(pair) {
|
||
|
return pair.map(Object.inspect).join(': ');
|
||
|
}).join(', ') + '}>';
|
||
|
}
|
||
|
});
|
||
|
|
||
|
function $H(object) {
|
||
|
if (object && object.constructor == Hash) return object;
|
||
|
return new Hash(object);
|
||
|
};
|