次のような複雑な入力名が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
data
しかし、オプションの配列内で jQuery.ajax() メソッドを介して送信する必要があります(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
は正常に機能しますが、複雑なケースtest3[1]
は理解できず、壊れてしまいます。
回避策
現在、次のような配列を作成する回避策を使用しています。これthis][is][][a][complex
は、HTTP リクエストによって.data[...]
data[
this][is][][a][complex][name
]
リサーチ
入力名を JavaScript 配列の質問に変換する方法に似ていますが、深さが 0 から無限 (通常はレベル 3 まで) であるため、もう少し複雑です。なので、eval(!)を使わないと何も作れません。