我有一些复杂的输入名称,例如: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
,它会请求它,而不是:
塔)。该请求将类似于:
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
可以正常工作,但像 nad 这样的复杂案例test3[1]
将无法理解并且会崩溃。
解决方法
目前,我正在使用一种解决方法来创建一个数组,例如:this][is][][a][complex
并且它被 HTTP 请求包含在data[...]
什么转向.data[
this][is][][a][complex][name
]
研究
它类似于如何将输入名称转换为 JavaScript 数组问题,但它有点复杂,因为深度是 0 到无限(通常到 3 级)。所以,除非我使用 eval (!),否则我什么都做不了。