2

次のような複雑な入力名が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

test1nadのような単純化されたケースtest2は正常に機能しますが、複雑なケースtest3[1]は理解できず、壊れてしまいます。

回避策

現在、次のような配列を作成する回避策を使用しています。これthis][is][][a][complexは、HTTP リクエストによって.data[...]data[this][is][][a][complex][name]

リサーチ

入力名を JavaScript 配列の質問に変換する方法に似ていますが、深さが 0 から無限 (通常はレベル 3 まで) であるため、もう少し複雑です。なので、eval(!)を使わないと何も作れません。

4

1 に答える 1

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/

于 2013-04-05T18:42:54.133 に答える