UNPKG

2.51 kBJavaScriptView Raw
1var util = require('./util/util');
2var isArray = util.isArray;
3var isObject = util.isObject;
4var hasOwn = Object.prototype.hasOwnProperty;
5
6/**
7 * Encode the given object to URI Component encoded query string
8 *
9 * @param {Object.<string, *>} object The object to encode
10 * @param {boolean} [keepArrayIndex] Whether to keep array index
11 * @returns {string} Returns the URI Component encoded query string
12 */
13function encode(object, keepArrayIndex) {
14 var key;
15 var keyValueArray = [];
16
17 keepArrayIndex = !!keepArrayIndex;
18
19 if ( isObject(object) ) {
20 for ( key in object ) {
21 if ( hasOwn.call(object, key) ) {
22 encodeKey(key, object[key], keyValueArray, keepArrayIndex);
23 }
24 }
25 }
26
27 return keyValueArray.join('&');
28}
29
30/**
31 * Encode the speceifed key in the object
32 *
33 * @param {string} key The key name
34 * @param {any} data The data of the key
35 * @param {string[]} keyValueArray The array to store the key value string
36 * @param {boolean} keepArrayIndex Whether to keep array index
37 */
38function encodeKey(key, data, keyValueArray, keepArrayIndex) {
39 var prop;
40 var index;
41 var length;
42 var value;
43 var subKey;
44
45 if ( isObject(data) ) {
46 for ( prop in data ) {
47 if ( hasOwn.call(data, prop) ) {
48 value = data[prop];
49 subKey = key + '[' + prop + ']';
50 encodeKey(subKey, value, keyValueArray, keepArrayIndex);
51 }
52 }
53 } else if ( isArray(data) ) {
54 index = 0;
55 length = data.length;
56
57 while (index < length) {
58 value = data[index];
59
60 if ( keepArrayIndex || isArray(value) || isObject(value) ) {
61 subKey = key + '[' + index + ']';
62 } else {
63 subKey = key + '[]';
64 }
65
66 encodeKey(subKey, value, keyValueArray, keepArrayIndex);
67
68 index += 1;
69 }
70 } else {
71 key = encodeURIComponent(key);
72 // if data is null, no `=` is appended
73 if (data === null) {
74 value = key;
75 } else {
76 // if data is undefined, treat it as empty string
77 if (data === undefined) {
78 data = '';
79 // make sure that data is string
80 } else if (typeof data !== 'string') {
81 data = '' + data;
82 }
83 value = key + '=' + encodeURIComponent(data);
84 }
85
86 keyValueArray.push(value);
87 }
88}
89
90module.exports = encode;