我有一些复杂的输入名称,如:this[is][][a][complex][name]
,我需要将其转换为数组/对象。像:
{ "this": { "is": [ { "a": { "complex": { "name": true } } } ] } }
我怎样才能使用纯javascript或jquery?
原因
我需要使用jQuery.ajax()方法发送它,如:
jQuery.ajax({
"data": {
"complex": complex_names,
"time": Date.now()
}, ...
});
如果我只是序列化this[is][][a][complex][name]=true
之类的数据,则会破坏HTTP请求,并将其发送为data[this[is][][a][complex][name]]
而不是data[this][is][][a][complex][name]
。
示例
我做了这个例子来帮助你。好吧,假设我有这个:
<input type="text" name="test1" value="ok" />
<input type="text" name="test2" value="ok" />
<input type="text" name="test3[1]" value="ok" />
<input type="text" name="test4[1][2]" value="ok" />
<input type="text" name="test5[]" value="ok" />
如果我通过POST直接发送,它会生成如下请求:
test1: ok
test2: ok
test3[1]: ok
test4[1][2]: ok
test5[]: ok
但我需要通过jQuery.ajax()方法发送它,在data
选项中的数组内部(如complex_data
和其他一些数据一样)。请求类似于:
call_time: 1612
call_title: test
complex_data[test1]: ok
complex_data[test2]: ok
complex_data[test3][1]: ok
complex_data[test4][1][2]: ok
complex_data[test5][]: ok
请注意,我的表单输入将在complex_data
对象中设置。但是,如果我只是将数据转换为数组,例如:
{
"test1": "ok",
"test2": "ok",
"test3[1]": "ok",
"test4[1][2]": "ok",
"test5[]": "ok",
}
然后将其发送给complex_data
,它会请求它,而不是:
TA)。请求类似于:
call_time: 1612
call_title: test
complex_data[test1]: ok
complex_data[test2]: ok
complex_data[test3][1]]: ok
complex_data[test4][1][2]]: ok
complex_data[test5][]]: ok
像test1
nad test2
这样的简化案例可以正常使用,但像test3[1]
这样的复杂案例将无法理解并会破坏。
解决方法
目前,我正在使用一种解决方案解决方案来创建类似于this][is][][a][complex
的数组,并且HTTP请求将其包含在data[...]
内,转而data[
{{ 1}} this][is][][a][complex][name
。
研究
它与How to convert input name to JavaScript array问题相似,但它有点复杂,因为深度为0到无穷(通常为3级)。所以,除非我使用eval(!),否则我无法做任何事情。
答案 0 :(得分:2)
有趣的问题,这就是我想出的:
function convert(s) {
var names = s.replace(/^\w+/, "$&]").replace(/]$/, "").split("][");
var result = {};
var obj = result;
var last;
for (var i = 0; i < names.length; i++) {
var name = names[i];
if (typeof last !== "undefined") {
obj[last] = name === "" ? [] : {};
obj = obj[last];
}
last = name === "" ? 0 : name;
}
obj[last] = true;
return result;
}
JSFiddle:http://jsfiddle.net/QdRvz/