我有一些复杂的输入名称,如: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
河畔test2
将正常工作,但复杂的情况下,像test3[1]
将不被理解和意志爆发。
替代方法
目前我使用的是像创建一个数组的解决方法解决方案:this][is][][a][complex
,它是由HTTP请求纳入data[...]
什么转data[
this][is][][a][complex][name
]
。
研究
它类似于How to convert input name to JavaScript array的问题,但它是一个有点复杂,因为深度为0到无穷大(一般到3级)。所以,除非使用eval(!),否则我无法做任何事情。
什么是你的决定是否'[]'或'{}'应该使用什么逻辑?你似乎在你的例子中混合它们,但我不明白为什么使用它。 **编辑:**没关系,我想我现在正在实现它... – Ian 2013-04-05 18:01:27
你不能只使用序列化方法? – dfsq 2013-04-05 18:04:51
如果我直接将它发送到AJAX'data'选项,Serialize方法会生成一个好结果。但是如果我需要将它发送给一个数组并将其发送给AJAX,它就会被破坏(就像** reason **主题一样)。我会尽力改进这个例子。 – 2013-04-05 18:15:32