Skip to content

Instantly share code, notes, and snippets.

@ezracelli
Created March 13, 2020 21:41
Show Gist options
  • Save ezracelli/9e9975fef8caefb7fc866457cb14ea05 to your computer and use it in GitHub Desktop.
Save ezracelli/9e9975fef8caefb7fc866457cb14ea05 to your computer and use it in GitHub Desktop.
jQuery serializeObject
function convertArrayObjectsToArrays (obj) {
return (function _traverse (obj) {
if (Object.prototype.toString.call(obj) === '[object Array]') {
return obj.map(el => _traverse(el));
}
else if (obj && Object.prototype.toString.call(obj) === '[object Object]') {
const keys = Object.keys(obj);
if (!keys.length || keys.find(key => !/\d/.test(key))) {
for (const key in obj) {
if (obj.hasOwnProperty(key)) obj[key] = _traverse(obj[key]);
}
return obj;
} else {
return Object.entries(obj).reduce((prev, [ key, value ]) => {
prev[key] = _traverse(value);
return prev;
}, []);
}
}
else return obj;
})(obj);
}
$.fn.serializeObject = function () {
const obj = $(this).serializeArray().reduce((prev, { name, value }) => {
const names = name.match(/(?<=\[).*?(?=\])/g) || [];
names.unshift.apply(names, name.match(/^[^\[]+/g) || []);
if (!names.length) return prev;
names.reduce((prev, name, i) => {
if (name === '') {
const index = Object.keys(prev).filter(key => /\d/.test(key));
name = index.length ? Math.max(index) + 1 : 0;
}
prev[name] = names.length - 1 === i ? value : (prev[name] || {});
return prev[name];
}, prev);
return prev;
}, {});
return convertArrayObjectsToArrays(obj);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment