// 合并赋值
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;
};
一般这样:
也可以这样玩: