-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathform-to-obj.js
80 lines (64 loc) · 1.75 KB
/
form-to-obj.js
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
73
74
75
76
77
78
79
80
function formToObj(form) {
var fields = formToArr(form);
fields.sort(function (a, b) {
return a.name.localeCompare(b.name);
});
return fields.reduce(function(obj, field) {
addProp(obj, field.name, field.value);
return obj;
}, {});
function formToArr(form) {
var inputs = form.querySelectorAll('input, textarea, select, [contenteditable=true]');
var arr = [];
for (var i = 0; i < inputs.length; ++i) {
var input = inputs[i],
name = input.name || input.getAttribute('data-name'),
val = input.value;
if (!name ||
((input.type === 'checkbox' || input.type === 'radio') && !input.checked)) {
continue;
}
if (input.getAttribute('contenteditable') === 'true') {
val = input.innerHTML;
}
arr.push({
name: name,
value: val
});
}
return arr;
}
function addProp(o, prop, val) {
var props = prop.split('.');
var lastProp = props.length - 1;
props.reduce(function (obj, prop, i) {
return setProp(obj, prop, i === lastProp
? val
: {});
}, o);
}
function setProp(obj, name, val) {
if (name.slice(-2) === '[]') {
makeArr(obj, name).push(val);
} else if (obj[name]) {
return obj[name];
} else if (name[name.length - 1] === ']') {
var arr = makeArr(obj, name);
if (arr.prevName === name) {
return arr[arr.length - 1];
}
arr.push(val);
arr.prevName = name;
} else {
obj[name] = val;
}
return val;
}
function makeArr(obj, name) {
var arrName = name.replace(/\[\d*\]/, '');
return (obj[arrName] || (obj[arrName] = []));
}
}
if (typeof module !== 'undefined' && module.exports) {
module.exports = formToObj;
}