9 exports.arrayToObject = function (source) {
12 for (var i = 0, il = source.length; i < il; ++i) {
13 if (typeof source[i] !== 'undefined') {
23 exports.merge = function (target, source) {
29 if (typeof source !== 'object') {
30 if (Array.isArray(target)) {
34 target[source] = true;
40 if (typeof target !== 'object') {
41 target = [target].concat(source);
45 if (Array.isArray(target) &&
46 !Array.isArray(source)) {
48 target = exports.arrayToObject(target);
51 var keys = Object.keys(source);
52 for (var k = 0, kl = keys.length; k < kl; ++k) {
54 var value = source[key];
60 target[key] = exports.merge(target[key], value);
68 exports.decode = function (str) {
71 return decodeURIComponent(str.replace(/\+/g, ' '));
78 exports.compact = function (obj, refs) {
80 if (typeof obj !== 'object' ||
87 var lookup = refs.indexOf(obj);
94 if (Array.isArray(obj)) {
97 for (var i = 0, il = obj.length; i < il; ++i) {
98 if (typeof obj[i] !== 'undefined') {
99 compacted.push(obj[i]);
106 var keys = Object.keys(obj);
107 for (i = 0, il = keys.length; i < il; ++i) {
109 obj[key] = exports.compact(obj[key], refs);
116 exports.isRegExp = function (obj) {
117 return Object.prototype.toString.call(obj) === '[object RegExp]';
121 exports.isBuffer = function (obj) {
124 typeof obj === 'undefined') {
129 return !!(obj.constructor &&
130 obj.constructor.isBuffer &&
131 obj.constructor.isBuffer(obj));