Jquery插件序列化表单为JSON对象

// 合并赋值
	function mergeSetValue(object, name, value, merge) {
		// 相同的name不进行替换,而是进行合并,合并成为一个数组
		if (merge == false) {
			object[name] = value;
		} else {
			// 相同的name不进行替换,而是进行合并,合并成为一个数组
			if (object[name]) {
				if ($.isArray(object[name])) {
					object[name].push(value);
				} else {
					object[name] = [object[name], value];
				}
			} else {
				object[name] = value;
			}
		}
	}

	// 解析变量
	function resolveVarName(object, name, value, merge) {
		// 识别是否符合格式:A[A][]、A[A]、A[A][A]
		// 不符合则当成字符串,符合则解析成对象
		if (new RegExp("^[a-zA-Z_][a-zA-Z0-9_]+((\\[[a-zA-Z0-9_]+\\]))*(\\[\\])?$").test(name)) {
			// 识别出[A]部分
			var subNames = name.match(new RegExp("\\[[a-zA-Z0-9_]+\\]", "g"));

			// 如果不包含“[”则直接赋值返回
			if (name.indexOf("[") < 0) {
				// 相同的name不进行替换,而是进行合并,合并成为一个数组
				mergeSetValue(object, name, value, merge);
				return object;
			}

			// 识别出变量名
			var var_name = name.substring(0, name.indexOf("["));

			if (object[var_name] == undefined) {
				object[var_name] = [];
			}

			// 设置临时变量
			var temp = object[var_name];

			for (i in subNames) {
				var subName = subNames[i];
				if (temp[subName] == undefined) {
					temp[subName] = [];
				}
				if (i == subNames.length - 1) {
					// 如果是以[]结尾则代表为数组
					if (new RegExp("\\[\\]$").test(name)) {
						temp[subName].push(value);
					} else {
						// 相同的name不进行替换,而是进行合并,合并成为一个数组
						mergeSetValue(temp, subName, value, merge);
					}
				}
				temp = temp[subName];
			}

			if (subNames == null || subNames.length == 0) {
				// 如果是以[]结尾则代表为数组
				if (new RegExp("\\[\\]$").test(name)) {
					object[var_name].push(value);
				} else {
					// 相同的name不进行替换,而是进行合并,合并成为一个数组
					mergeSetValue(object, var_name, value, merge);
				}
			}

			return object;
		} else {
			if (merge == false) {
				object[name] = value;
			} else {
				// 相同的name不进行替换,而是进行合并,合并成为一个数组
				mergeSetValue(object, name, value, merge);
			}
			return object;
		}
	}

	/**
	 * 将表单序列号为JSON对象
	 * 
	 * @param merge
	 *            相同name的元素是否进行合并,默认不进行合并,true-进行合并 false-不进行合并
	 */
	$.fn.serializeJson = function(merge) {

		if (merge == undefined || merge == null) {
			merge = false;
		}

		var serializeObj = {};
		var array = [];

		// 判断当前元素是否为input元素
		if ($(this).is(":input")) {
			array = $(this).serializeArray();
		} else {
			array = $(this).find(":input").serializeArray();
		}

		$(array).each(function() {
			resolveVarName(serializeObj, this.name, this.value, merge);
		});
		return serializeObj;
	};

 一般这样:

 

 也可以这样玩:



 

 

猜你喜欢

转载自niqingyang.iteye.com/blog/2276536