Skip to content

Commit f583af1

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

File tree

3 files changed

+44
-11
lines changed

3 files changed

+44
-11
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

+23-10
Original file line numberDiff line numberDiff line change
@@ -48,38 +48,51 @@
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 = '';
52+
53+
function incrementPush(path, key) {
54+
pushes[path] = pushes[path] || {
55+
size: 0,
56+
keys_set: {}
57+
};
58+
if (pushes[path].keys_set[key]) {
59+
pushes[path].size ++;
60+
pushes[path].keys_set = {}
61+
for (var sub_path in pushes){
62+
if (sub_path != path && 0 == sub_path.indexOf(path)){
63+
pushes[sub_path] = undefined;
64+
}
65+
}
66+
}
67+
pushes[path].keys_set[key] = true
68+
return pushes[path].size;
69+
}
5370

5471
// nest, nest, ..., nest
5572
while ((k = keys.pop()) !== undefined) {
5673
// foo[]
5774
if (patterns.push.test(k)) {
58-
var idx = incrementPush(root.replace(/\[\]$/, ''));
75+
var idx = incrementPush(keys.join('.'), key_pushes);
5976
value = build([], idx, value);
77+
key_pushes += '[' + idx +']';
6078
}
6179

6280
// foo[n]
6381
else if (patterns.fixed.test(k)) {
6482
value = build([], k, value);
83+
key_pushes += '[' + k + ']';
6584
}
6685

6786
// foo; foo[bar]
6887
else if (patterns.named.test(k)) {
6988
value = build({}, k, value);
89+
key_pushes += k;
7090
}
7191
}
7292

7393
return value;
7494
}
7595

76-
function incrementPush(key) {
77-
if (pushes[key] === undefined) {
78-
pushes[key] = 0;
79-
}
80-
return pushes[key]++;
81-
}
82-
8396
function encode(pair) {
8497
switch ($('[name="' + pair.name + '"]', $form).attr("type")) {
8598
case "checkbox":

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)