1

次の形式のフォームがあります(フォームの一部のみ)

<input type="text" name="Journal[data][serviceaddress][company]" value="{{company}}"/>
<input type="text" name="Journal[data][serviceaddress][address]" value="{{address}}"/>
<input type="text" name="Journal[data][serviceaddress][zip]" value="{{zip}}"/>
<textarea name="Journal[data][serviceaddress][notes]">{{notes}}</textarea>
<input type="text" name="Journal[rows][1][title]"/>
<input type="text" name="Journal[rows][1][body]"/>
<input type="text" name="Journal[rows][2][title]"/>
<input type="text" name="Journal[rows][2][body]"/>

これを次のJSONオブジェクトに変換したい

{
    data:{
        serviceaddress:{
            company: "companyvalue",
            address: "addressvalue",
            zip: "zipvalue",
            notes: "notesvalue"
        }
    },
    rows:{
        1:{
            title: "row1title",
            body: "row1body"
        },
        2:{
            title: "row2title",
            body: "row2body"
        }
    }
}

これを行うための最良の方法はどれですか?私はすでにこれを行った人であるに違いないと思いましたが、検索したときに見つけたのは、ネストされたJSONデータではなく、入力名をキーとして必要としている人だけでした...

4

1 に答える 1

1

満足のいく解決策であるとわかった既存のものを見つけることができなかったので、私は自分で作成しました。

function getData(){
            var data = {};
            $('.data input,.data textarea').each(function(){
                var val = $(this).val();
                var namestr = $(this).attr('name').substr(8);
                namestr = namestr.substring(0,namestr.length-1);
                var namearray = namestr.split('][');

                var currentlevel = data;
                if (namearray[0] == 'data'){
                    namearray = namearray.splice(1,namearray.length);
                    for (var i=0;i < namearray.length;i++){
                        if (currentlevel[namearray[i]] == undefined && i != namearray.length-1){
                            currentlevel[namearray[i]] = {};
                        }
                        else if (namearray.length-1 == i){
                            currentlevel[namearray[i]] = val;
                            break;
                        } //In the end, put a value
                        currentlevel = currentlevel[namearray[i]]
                    }   
                }
            });
            return data;
        }

ご覧のとおり、これは名前の最初の「配列」パラメーターが「データ」である入力/テキストエリアタグのみを調べます。つまり、名前が「Myform [データ] [値1]」の形式のフィールドのみを解析します"。これは、必要に応じて簡単に変更できます。

于 2013-05-20T18:58:41.247 に答える