// License: LGPL-3.0-or-later // 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 }