我想用JavaScript将由方括号组成的字段名转换为对象。我看到PHP确实将它们转换成了一个数组,但尽管已经搜索了好几天,但还没有看到用JavaScript完成。
数据:
<input name="address[permanent][name]" type="text" value="My Address">
<input name="address[permanent][street][street_one]" type="text" value="My Street One">
<input name="address[permanent][street][street_two]" type="text" value="My Street Two">
结果(我想要实现的):
form = { address: { permanent: { name: "My Address", street: { street_one: "My Street One", street_two: "My Street Two" } } } }
未测试,但您的基本算法可能是这样的:
以下对我有效:
var form = {};
$(':input', yourFormElement).each(function(){
var top = form;
var path = $(this).attr('name');
var val = $(this).val();
var prev = '';
while ((path.replace(/^('[?'w+']?)(.*)$/, function(_m, _part, _rest) {
prev = path;
_part = _part.replace(/[^A-Za-z_]/g, '');
if (!top.hasOwnProperty(_part)) {
if (/'w+/.test(_rest)) {
top[_part] = {};
top = top[_part];
} else {
top[_part] = val;
}
} else if (!/'w+/.test(_rest)) {
top[_part] = val;
} else {
top = top[_part];
}
path = _rest;
})) && (prev !== path));
});
用jQuery表达式替换yourFormElement
以获得所需的表单元素。
它对每个:input
元素(表单输入)进行迭代,然后对每个循环尝试使用正则表达式分解名称的"路径",同时创建和/或遍历正在构建的form
数据结构。最后,输入的值被分配给已经遍历到的叶节点。
它的工作示例:http://jsfiddle.net/8fpLx/10/
while循环中的一系列条件可以简化很多,但它是有效的。