質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.34%

Javascript オブジェクトのnameから新たに連想配列を作成したい

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 525

score 22

お世話になります。

オブジェクトが下記のようにいっきにとれてきて、

 0: {name: "HUMAN[1].NAME", value: "田中 雅子"}
 1: {name: "HUMAN[1].KANA", value: "タナカ マサコ"}
 2: {name: "HUMAN[1].BIRTHDAY", value: "1905/07/20 0:00:00"}
 3: {name: "HUMAN[1].AGE", value: "114"}
 4: {name: "ADDRESS[0].PREF", value: "愛知県"}
 5: {name: "ADDRESS[0].CITY", value: "名古屋市"}
 6: {name: "ADDRESS[0].BANTI", value: "43"}
 7: {name: "HUMAN[0].NAME", value: "山田 太郎"}
 8: {name: "HUMAN[0].KANA", value: "ヤマダ タロウ"}
 9: {name: "HUMAN[0].BIRTHDAY", value: "1905/07/20 0:00:00"}
10: {name: "HUMAN[0].AGE", value: "114"}
11: {name: "ADDRESS[1].PREF", value: "青森県"}
12: {name: "ADDRESS[1].CITY", value: "弘前市"}
13: {name: "ADDRESS[1].BANTI", value: "4"}

最終的に下記のような連想配列に変換したいと思っていますが

HUMAN:
0: {NAME: "田中 雅子", KANA: "タナカ マサコ", BIRTHDAY: "1905/07/20 0:00:00", AGE: "114" …}
1: {NAME: "山田 太郎", KANA: "ヤマダ タロウ", BIRTHDAY: "1905/07/20 0:00:00", AGE: "114" …}

ADDRESS:
0: {PREF: "青森県", CITY: "弘前市", BANTI: "4" …}
1: {PREF: "愛知県", CITY: "名古屋市", BANTI: "43" …}

今の時点で下記のように全て空になってしまいます。

HUMAN:
0: {}

ADDRESS:
0: {}

いまのところのソースは下記のとおりです。アドバイスいただけないでしょうか、

$.fn.serializeModelHumanAddress = function () {
    var model_array_row = this.serializeArray();
    /* model_array_rowには同時に対象ではない値もとれてくる  */

    var model_array_human= model_array_row.filter(function (item, index) {
        if ((item.name).indexOf('HUMAN') !== -1) return true;
    });

    var model_array_address= model_array_row.filter(function (item, index) {
        if ((item.name).indexOf('ADDRESS') !== -1) return true;
    });

    var all_model_array = [model_array_human, model_array_address];

    var model_array_parent = {};
    var model_array = {};

    var model_name = "";
    var model_level = "";
    var prop_name = "";

    var model_name_was = "";
    var model_level_was = "";

    all_model_array.forEach(function (model) {

        var model_count = Object.keys(model).length

        for (var key in model_array_parent) {
            delete model_array_parent[key];
        }

        model_level_was = "";


        var i = 0;
        model.forEach(function (item) {

            var item_name = item.name;                   // HUMAN[0].NAME
            var item_split1 = item_name.split('[');      // ['HUMAN', '0].NAME']
            var item_split2 = item_split1[1].split(']'); // ['0', '.NAME']
            var item_split3 = item_split2[1].split('.'); // ['.', 'NAME']

            model_name = item_split1[0];                 // HUMAN
            model_level = item_split2[0];                // 0
            prop_name = item_split3[1];                  // NAME

            if ((model_level_was == "" || model_level_was == model_level) && i+1 != model_count) {
                model_array[prop_name] = (item.value);
                model_level_was = model_level;

            } else {
                if (i + 1 == model_count) {
                    model_array[prop_name] = (item.value);
                    model_level_was = model_level;
                }

                model_array_parent[model_level] = model_array;

                for (var key in model_array) {
                    delete model_array[key];
                }
            }


            ++i;
        })

        vars[model_name] = model_array_parent;

    });

    return vars;
};
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

添え字の位置にオブジェクトがなければ作成し、そこにプロパティを追加しておけば良いと思います。

$.fn.serializeModelHumanAddress = function () {
    var serializedModel = {
        HUMAN : [],
        ADDRESS : []
    }

    model.forEach(function (item) {

        var item_name = item.name;                   // HUMAN[0].NAME
        var item_split1 = item_name.split('[');      // ['HUMAN', '0].NAME']
        var item_split2 = item_split1[1].split(']'); // ['0', '.NAME']
        var item_split3 = item_split2[1].split('.'); // ['.', 'NAME']

        model_name = item_split1[0];                 // HUMAN
        model_level = item_split2[0];                // 0
        prop_name = item_split3[1];                  // NAME

        if(!serializedModel[model_name][model_level]){
            serializedModel[model_name][model_level] = {};
        }

        serializedModel[model_name][model_level][prop_name] = item.value;
    })

    return serializedModel;
};

おまけ(reduceを使う版)

$.fn.serializeModelHumanAddress = function () {
    return model.reduce((cur, item) => {

        var item_name = item.name;                   // HUMAN[0].NAME
        var item_split1 = item_name.split('[');      // ['HUMAN', '0].NAME']
        var item_split2 = item_split1[1].split(']'); // ['0', '.NAME']
        var item_split3 = item_split2[1].split('.'); // ['.', 'NAME']

        model_name = item_split1[0];                 // HUMAN
        model_level = item_split2[0];                // 0
        prop_name = item_split3[1];                  // NAME

        if (!cur[model_name][model_level]) {
            cur[model_name][model_level] = {};
        }
        cur[model_name][model_level][prop_name] = item.value;

        return cur;
    },
    {
        HUMAN: [],
        ADDRESS: []
    });
};

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/09/13 13:36

    ご回答ありがとうございました。
    無事に成功しました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る