44 lines
1.3 KiB
JavaScript
44 lines
1.3 KiB
JavaScript
|
// Convert a form to an object literal
|
||
|
module.exports = function(form) {
|
||
|
if(form === undefined) throw new Error("form is undefined")
|
||
|
var result = {}
|
||
|
var fields = toArr(form.querySelectorAll('input, textarea, select'))
|
||
|
.filter(function(n) { return n.hasAttribute('name') })
|
||
|
.map(function(n) {
|
||
|
var name = n.getAttribute('name')
|
||
|
var keys = n.getAttribute('name').split('.')
|
||
|
if(n.value && n.value.toString().length) { // won't set empty strings for empty vals
|
||
|
if(n.getAttribute('type') === 'checkbox') {
|
||
|
deepSet(keys, n.checked, result)
|
||
|
} else if(n.getAttribute('type') === 'radio') {
|
||
|
if(n.checked) deepSet(keys, n.value, result)
|
||
|
} else {
|
||
|
deepSet(keys, n.value, result)
|
||
|
}
|
||
|
}
|
||
|
})
|
||
|
|
||
|
return result
|
||
|
}
|
||
|
|
||
|
function toArr(x) { return Array.prototype.slice.call(x) }
|
||
|
|
||
|
// Given an array of nested keys, a value, and a target object:
|
||
|
// Set the value into the object at the last nested key
|
||
|
function deepSet(keys, val, obj, options) {
|
||
|
var exceptLast = keys.slice(0, keys.length-1)
|
||
|
var last = keys[keys.length-1]
|
||
|
var nested = exceptLast.reduce(function(nestedObj, key) {
|
||
|
if(nestedObj[key] === undefined) {
|
||
|
nestedObj[key] = {}
|
||
|
return nestedObj[key]
|
||
|
} else {
|
||
|
return nestedObj[key]
|
||
|
}
|
||
|
}, obj)
|
||
|
// if(nested[last] === undefined) nested[last] = {}
|
||
|
nested[last] = val
|
||
|
return obj
|
||
|
}
|
||
|
|