Skip to content

Commit a9ec350

Browse files
committed
properly handled nested array
1 parent efaebf6 commit a9ec350

File tree

3 files changed

+41
-8
lines changed

3 files changed

+41
-8
lines changed

Diff for: dist/jquery.serialize-object.min.js

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: jquery.serialize-object.js

+20-7
Original file line numberDiff line numberDiff line change
@@ -48,36 +48,49 @@
4848
}
4949

5050
function makeObject(root, value) {
51-
52-
var keys = root.match(patterns.key), k;
51+
var keys = root.match(patterns.key), k, key_pushes = '';
5352

5453
// nest, nest, ..., nest
5554
while ((k = keys.pop()) !== undefined) {
5655
// foo[]
5756
if (patterns.push.test(k)) {
58-
var idx = incrementPush(root.replace(/\[\]$/, ''));
57+
var idx = incrementPush(keys.join('.'), key_pushes);
5958
value = build([], idx, value);
59+
key_pushes += '[' + idx +']';
6060
}
6161

6262
// foo[n]
6363
else if (patterns.fixed.test(k)) {
6464
value = build([], k, value);
65+
key_pushes += '[' + k + ']';
6566
}
6667

6768
// foo; foo[bar]
6869
else if (patterns.named.test(k)) {
6970
value = build({}, k, value);
71+
key_pushes += k;
7072
}
7173
}
7274

7375
return value;
7476
}
7577

76-
function incrementPush(key) {
77-
if (pushes[key] === undefined) {
78-
pushes[key] = 0;
78+
function incrementPush(path, key) {
79+
pushes[path] = pushes[path] || {
80+
size: 0,
81+
keys_set: {}
82+
};
83+
if (pushes[path].keys_set[key]) {
84+
pushes[path].size ++;
85+
pushes[path].keys_set = {}
86+
for (var sub_path in pushes){
87+
if (sub_path != path && 0 == sub_path.indexOf(path)){
88+
pushes[sub_path] = undefined;
89+
}
90+
}
7991
}
80-
return pushes[key]++;
92+
pushes[path].keys_set[key] = true
93+
return pushes[path].size;
8194
}
8295

8396
function encode(pair) {

Diff for: test/integration/encode-test.js

+20
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,26 @@ describe("encode", function() {
1717
assert.deepEqual($form.serializeObject(), {a: {b: {c: true}}});
1818
});
1919

20+
it("checkbox inputs as array don't break", function() {
21+
var $form = $('<form><input type="checkbox" name="a[]" value="c" checked></form>');
22+
assert.deepEqual($form.serializeObject(), {a: ["c"] });
23+
});
24+
25+
it("checkbox inputs as nested arrays don't break", function() {
26+
var $form = $('<form><input type="checkbox" name="a[][b][]" value="c" checked><input type="checkbox" name="a[][b][]" value="d"></form>');
27+
assert.deepEqual($form.serializeObject(), {a: [ { b: ["c"]}]});
28+
});
29+
30+
it("crazy nested arrays don't break", function() {
31+
var $form = $('<form><input name="a[][b]" value="1"><input name="a[][c][]" value="2"><input name="a[][c][]" value="3"><input name="a[][b]" value="4"><input name="a[][c][]" value="5"><input name="a[][c][]" value="6"></form>');
32+
assert.deepEqual($form.serializeObject(), {a: [ { b: "1", c: ["2", "3"] }, { b: "4", c: ["5", "6"] } ]});
33+
});
34+
35+
it("checkbox inputs as nested arrays with a sibling don't break", function() {
36+
var $form = $('<form><input type="checkbox" name="a[][b][]" value="c" checked><input name="a[][d]" value="e" checked></form>');
37+
assert.deepEqual($form.serializeObject(), {a: [ { b: ["c"], d: 'e' } ]});
38+
});
39+
2040
it("checkbox inputs as booleans if value is 'on'", function() {
2141
var $form = $('<form><input type="checkbox" name="a" value="on" checked></form>');
2242
assert.deepEqual($form.serializeObject(), {a: true});

0 commit comments

Comments
 (0)