2011-11-05 16:46:53 +00:00
|
|
|
'use strict';
|
|
|
|
|
2011-10-07 01:04:47 +00:00
|
|
|
/*@
|
|
|
|
Ox.extend <function> Extends an object with one or more other objects
|
|
|
|
> Ox.extend({a: 1, b: 1, c: 1}, {b: 2, c: 2}, {c: 3})
|
|
|
|
{a: 1, b: 2, c: 3}
|
|
|
|
@*/
|
2012-05-19 09:39:25 +00:00
|
|
|
Ox.extend = function(obj) {
|
2012-05-21 20:04:22 +00:00
|
|
|
Ox.forEach(Ox.slice(arguments, 1), function(arg, i) {
|
2011-10-07 01:04:47 +00:00
|
|
|
Ox.forEach(arg, function(val, key) {
|
|
|
|
obj[key] = val;
|
|
|
|
});
|
|
|
|
});
|
|
|
|
return obj;
|
|
|
|
};
|
|
|
|
|
2012-05-19 09:39:25 +00:00
|
|
|
Ox.hasOwn = function(obj, val) {
|
|
|
|
return Object.prototype.hasOwnProperty.call(obj, val)
|
|
|
|
};
|
|
|
|
|
2011-10-27 18:50:23 +00:00
|
|
|
/*@
|
2012-01-04 07:42:48 +00:00
|
|
|
Ox.keyOf <f> Equivalent of [].indexOf for objects
|
|
|
|
> Ox.keyOf({a: 1, b: 2, c: 3}, 1)
|
|
|
|
'a'
|
2011-10-27 18:50:23 +00:00
|
|
|
@*/
|
|
|
|
Ox.keyOf = function(obj, val) {
|
|
|
|
var key;
|
|
|
|
Ox.forEach(obj, function(v, k) {
|
2012-03-30 14:11:29 +00:00
|
|
|
if (v === val) {
|
2011-10-27 18:50:23 +00:00
|
|
|
key = k;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
return key;
|
|
|
|
};
|
|
|
|
|
2012-01-07 07:20:02 +00:00
|
|
|
/*@
|
|
|
|
Ox.methods <f> Returns a sorted list of all method names of an object
|
|
|
|
> Ox.methods({a: [], b: false, f: function() {}, n: 0, o: {}, s: ''})
|
|
|
|
['f']
|
|
|
|
@*/
|
2012-05-21 20:04:22 +00:00
|
|
|
Ox.methods = function(obj, includePrototype) {
|
|
|
|
var key, keys;
|
|
|
|
if (includePrototype) {
|
|
|
|
keys = [];
|
|
|
|
for (var key in obj) {
|
|
|
|
keys.push(key);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
keys = Object.keys(obj);
|
|
|
|
}
|
|
|
|
return keys.filter(function(key) {
|
2012-01-07 07:20:02 +00:00
|
|
|
return Ox.isFunction(obj[key]);
|
|
|
|
}).sort();
|
|
|
|
};
|
|
|
|
|
2011-10-07 01:04:47 +00:00
|
|
|
/*@
|
|
|
|
Ox.serialize <f> Parses an object into query parameters
|
|
|
|
> Ox.serialize({a: 1, b: 2, c: 3})
|
|
|
|
'a=1&b=2&c=3'
|
|
|
|
> Ox.serialize({a: -1, b: 2.3, c: [4, 5]})
|
|
|
|
'a=-1&b=2.3&c=4,5'
|
|
|
|
> Ox.serialize({string: 'foo', empty: {}, null: null, undefined: void 0})
|
|
|
|
'string=foo'
|
|
|
|
@*/
|
|
|
|
Ox.serialize = function(obj) {
|
|
|
|
var arr = [];
|
|
|
|
Ox.forEach(obj, function(val, key) {
|
|
|
|
if (!Ox.isEmpty(val) && !Ox.isNull(val) && !Ox.isUndefined(val)) {
|
|
|
|
arr.push(key + '=' + val);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
return arr.join('&');
|
|
|
|
};
|
|
|
|
|
|
|
|
/*@
|
|
|
|
Ox.unserialize <f> Parses query parameters into an object
|
|
|
|
> Ox.unserialize('a=1&b=2&c=3')
|
|
|
|
{a: '1', b: '2', c: '3'}
|
|
|
|
> Ox.unserialize('a=-1&b=2.3&c=4,5', true)
|
|
|
|
{a: -1, b: 2.3, c: [4, 5]}
|
2012-01-04 07:42:48 +00:00
|
|
|
> Ox.unserialize('a=1&b=&c&a=0', true)
|
|
|
|
{a: 0}
|
2011-10-07 01:04:47 +00:00
|
|
|
@*/
|
|
|
|
Ox.unserialize = function(str, toNumber) {
|
|
|
|
var obj = {};
|
|
|
|
Ox.forEach(str.split('&'), function(val) {
|
|
|
|
if (val) {
|
|
|
|
var arr = val.split('=');
|
2012-01-04 07:42:48 +00:00
|
|
|
if (arr[1]) {
|
|
|
|
obj[arr[0]] = !toNumber ? arr[1]
|
|
|
|
: arr[1].indexOf(',') == -1 ? +arr[1]
|
|
|
|
: arr[1].split(',').map(function(val) {
|
|
|
|
return +val;
|
|
|
|
});
|
|
|
|
}
|
2011-10-07 01:04:47 +00:00
|
|
|
}
|
|
|
|
});
|
|
|
|
return obj;
|
|
|
|
};
|