Skip to content

Commit 04eac8d

Browse files
committed
[Fix] stringify: avoid encoding arrayformat comma when encodeValuesOnly = true (#424)
Fixes #410
1 parent 9dab77e commit 04eac8d

File tree

2 files changed

+18
-18
lines changed

2 files changed

+18
-18
lines changed

lib/stringify.js

+14-4
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ var arrayPrefixGenerators = {
1818
};
1919

2020
var isArray = Array.isArray;
21+
var split = String.prototype.split;
2122
var push = Array.prototype.push;
2223
var pushToArray = function (arr, valueOrArray) {
2324
push.apply(arr, isArray(valueOrArray) ? valueOrArray : [valueOrArray]);
@@ -81,6 +82,14 @@ var stringify = function stringify(
8182
if (typeof obj === 'string' || typeof obj === 'number' || typeof obj === 'boolean' || utils.isBuffer(obj)) {
8283
if (encoder) {
8384
var keyValue = encodeValuesOnly ? prefix : encoder(prefix, defaults.encoder, charset);
85+
if (generateArrayPrefix === 'comma' && encodeValuesOnly) {
86+
var valuesArray = split.call(String(obj), ',');
87+
var valuesJoined = '';
88+
for (var i = 0; i < valuesArray.length; ++i) {
89+
valuesJoined += (i === 0 ? '' : ',') + formatter(encoder(valuesArray[i], defaults.encoder, charset));
90+
}
91+
return [formatter(keyValue) + '=' + valuesJoined];
92+
}
8493
return [formatter(keyValue) + '=' + formatter(encoder(obj, defaults.encoder, charset))];
8594
}
8695
return [formatter(prefix) + '=' + formatter(String(obj))];
@@ -100,16 +109,17 @@ var stringify = function stringify(
100109
objKeys = sort ? keys.sort(sort) : keys;
101110
}
102111

103-
for (var i = 0; i < objKeys.length; ++i) {
104-
var key = objKeys[i];
112+
for (var j = 0; j < objKeys.length; ++j) {
113+
var key = objKeys[j];
114+
var value = typeof key === 'object' && key.value !== undefined ? key.value : obj[key];
105115

106116
if (skipNulls && obj[key] === null) {
107117
continue;
108118
}
109119

110120
if (isArray(obj)) {
111121
pushToArray(values, stringify(
112-
obj[key],
122+
value,
113123
typeof generateArrayPrefix === 'function' ? generateArrayPrefix(prefix, key) : prefix,
114124
generateArrayPrefix,
115125
strictNullHandling,
@@ -125,7 +135,7 @@ var stringify = function stringify(
125135
));
126136
} else {
127137
pushToArray(values, stringify(
128-
obj[key],
138+
value,
129139
prefix + (allowDots ? '.' + key : '[' + key + ']'),
130140
generateArrayPrefix,
131141
strictNullHandling,

test/stringify.js

+4-14
Original file line numberDiff line numberDiff line change
@@ -99,8 +99,7 @@ test('stringify()', function (t) {
9999
t.test('stringifies a nested array value', function (st) {
100100
st.equal(qs.stringify({ a: { b: ['c', 'd'] } }, { encodeValuesOnly: true, arrayFormat: 'indices' }), 'a[b][0]=c&a[b][1]=d');
101101
st.equal(qs.stringify({ a: { b: ['c', 'd'] } }, { encodeValuesOnly: true, arrayFormat: 'brackets' }), 'a[b][]=c&a[b][]=d');
102-
st.equal(qs.stringify({ a: { b: ['c', 'd'] } }, { encodeValuesOnly: true, arrayFormat: 'comma' }), 'a[b]=c%2Cd');
103-
st.equal(qs.stringify({ a: { b: ['c', 'd'] } }, { encodeValuesOnly: true, arrayFormat: 'comma' }), 'a[b]=c,d', '(pending issue #378)', { skip: true });
102+
st.equal(qs.stringify({ a: { b: ['c', 'd'] } }, { encodeValuesOnly: true, arrayFormat: 'comma' }), 'a[b]=c,d');
104103
st.equal(qs.stringify({ a: { b: ['c', 'd'] } }, { encodeValuesOnly: true }), 'a[b][0]=c&a[b][1]=d');
105104
st.end();
106105
});
@@ -122,22 +121,13 @@ test('stringify()', function (t) {
122121
'a.b[]=c&a.b[]=d',
123122
'brackets: stringifies with dots + brackets'
124123
);
125-
st.equal(
126-
qs.stringify(
127-
{ a: { b: ['c', 'd'] } },
128-
{ allowDots: true, encodeValuesOnly: true, arrayFormat: 'comma' }
129-
),
130-
'a.b=c%2Cd',
131-
'comma: stringifies with dots + comma'
132-
);
133124
st.equal(
134125
qs.stringify(
135126
{ a: { b: ['c', 'd'] } },
136127
{ allowDots: true, encodeValuesOnly: true, arrayFormat: 'comma' }
137128
),
138129
'a.b=c,d',
139-
'comma: stringifies with dots + comma (pending issue #378)',
140-
{ skip: true }
130+
'comma: stringifies with dots + comma'
141131
);
142132
st.equal(
143133
qs.stringify(
@@ -202,8 +192,8 @@ test('stringify()', function (t) {
202192
st.equal(
203193
qs.stringify({ a: [{ b: 1 }, 2, 3] }, { encodeValuesOnly: true, arrayFormat: 'comma' }),
204194
'???',
205-
'brackets => brackets (pending issue #378)',
206-
{ skip: true }
195+
'brackets => brackets',
196+
{ skip: 'TODO: figure out what this should do' }
207197
);
208198
st.equal(
209199
qs.stringify({ a: [{ b: 1 }, 2, 3] }, { encodeValuesOnly: true }),

0 commit comments

Comments
 (0)