forked from instructure/canvas-lms
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathjquery.toJSON.js
More file actions
73 lines (57 loc) · 1.61 KB
/
Copy pathjquery.toJSON.js
File metadata and controls
73 lines (57 loc) · 1.61 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
define(['jquery', 'compiled/jquery/serializeForm'], function ($){
var patterns = {
validate: /^[a-zA-Z][a-zA-Z0-9_-]*(?:\[(?:\d*|[a-zA-Z0-9_-]+)\])*$/,
key: /[a-zA-Z0-9_-]+|(?=\[\])/g,
push: /^$/,
fixed: /^\d+$/,
named: /^[a-zA-Z0-9_-]+$/
};
var build = function(base, key, value){
base[key] = value;
return base;
};
$.fn.toJSON = function() {
var json = {},
push_counters = {};
var push_counter = function(key, i){
if(push_counters[key] === undefined){
push_counters[key] = 0;
}
if(i === undefined){
return push_counters[key]++;
}
else if(i !== undefined && i > push_counters[key]){
return push_counters[key] = ++i;
}
};
$.each($(this).serializeForm(), function(){
// skip invalid keys
if(!patterns.validate.test(this.name)){
return;
}
var k,
keys = this.name.match(patterns.key),
merge = this.value,
reverse_key = this.name;
while((k = keys.pop()) !== undefined){
// adjust reverse_key
reverse_key = reverse_key.replace(new RegExp("\\[" + k + "\\]$"), '');
// push
if(k.match(patterns.push)){
merge = build([], push_counter(reverse_key), merge);
}
// fixed
else if(k.match(patterns.fixed)){
push_counter(reverse_key, k);
merge = build([], k, merge);
}
// named
else if(k.match(patterns.named)){
merge = build({}, k, merge);
}
}
json = $.extend(true, json, merge);
});
return json;
};
});