Source: form/js/formSerializerData.js

/*!
 * formSerializerData
 * https://github.com/Voliware/Template
 * Licensed under the MIT license.
 */

/**
 * An object that holds form data
 * and can output it in different ways
 */
class FormSerializerData {

	/**
	 * Constructor
	 * @param {object} [data={}]
	 * @returns {FormSerializerData}
	 */
	constructor(data){
		this.data = data || {};
		return this;
	}

	/**
	 * Set the data
	 * @param {object} data
	 * @returns {FormSerializerData}
	 */
	set(data){
		this.data = data;
		return this;
	}

	/**
	 * Convert the data to a serialized string
	 * @returns {string}
	 */
	toString(){
		var data = "";
		var c = 0;
		var len = Object.keys(this.data).length;
		Util.each(this.data, function(i, e){
			data += i + "=" + e.val;
			if(c++ < len - 1)
				data += "&";
		});
		return data;
	}

	/**
	 * Convert the data to an
	 * ordered serialized string
	 * @returns {string}
	 */
	toOrderedString(){
		var data = "";
		var ordered = [];
		var unordered = [];
		Util.each(this.data, function(i, e){
			var obj = {
				name : i,
				val : e.val
			};
			if(e.order > -1)
				ordered[e.order] = obj;
			else
				unordered.push(obj);
		});

		var len = ordered.length;
		for(var i = 0; i < len; i++){
			data += ordered[i].name + '=' + ordered[i].val;
			if(i < len)
				data += "&";
		}

		len = unordered.length;
		for(i = 0; i < len; i++){
			data += unordered[i].name + '=' + unordered[i].val;
			if(i < len - 1)
				data += "&";
		}

		return data;
	}

	/**
	 * Convert the data to an object
	 * @returns {object}
	 */
	toObject(){
		var data = {};
		Util.each(this.data, function(i, e){
			// convert string numbers to real numbers
			data[i] = (e.val !== "" && !isNaN(e.val))
				? parseInt(e.val)
				: data[i] = e.val;
		});
		return data;
	}

	/**
	 * Convert the data into a single value.
	 * This is only useful if the form only has one input.
	 * @returns {*}
	 */
	toValue(){
		var data = null;
		// data will be the last iterated object value
		// using this function though, the form is
		// expected to only have one input anyway
		Util.each(this.data, function(i, e){
			// convert string numbers to real numbers
			data = isNaN(e.val)
				? e.val
				: parseInt(e.val);
		});
		return data;
	}
}