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

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

新規登録して質問してみよう
ただいま回答率
85.50%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

1679閲覧

【JavaScript】オブジェクトの配列をオブジェクトに組み替える方法

takenyaan

総合スコア119

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2016/01/07 17:49

JavaScript初心者です。

下記のようなオブジェクトの配列を

javascript

1var hoge = [ 2 { 3 "category1": "A", 4 "category2": "AA", 5 "item": "item1" 6 }, 7 { 8 "category1": "A", 9 "category2": "AA", 10 "item": "item2" 11 }, 12 { 13 "category1": "A", 14 "category2": "AB", 15 "item": "item3" 16 }, 17 { 18 "category1": "B", 19 "category2": "BB", 20 "item": "item4" 21 }, 22 { 23 "category1": "C", 24 "category2": "CC", 25 "item": "item5" 26 } 27]

下記のように重複しているキーで組み替えてオブジェクトにするためには、
どのように処理を記述すればスマートでしょうか?
便利ライブラリのようなものがありますでしょうか?

javascript

1var newHoge = { 2 "category1s": [ 3 { 4 "category1": "A", 5 "category2s": [ 6 { 7 "category2": "AA", 8 "items": [ 9 { 10 "item": "item1" 11 }, 12 { 13 "item": "item2" 14 } 15 ] 16 }, 17 { 18 "category2": "AB", 19 "items": [ 20 { 21 "item": "item3" 22 } 23 ] 24 } 25 ] 26 }, 27 { 28 "category1": "B", 29 "category2s": [ 30 { 31 "category2": "BB", 32 "items": [ 33 { 34 "item": "item4" 35 } 36 ] 37 } 38 ] 39 }, 40 { 41 "category1": "C", 42 "category2s": [ 43 { 44 "category2": "CC", 45 "items": [ 46 { 47 "item": "item5" 48 } 49 ] 50 } 51 ] 52 } 53 ] 54}

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

以下に hoge の形式で重複した要素を集約するオブジェクトを生成するサンプルコードを挙げておきます。私には newHoge の構造が非常に冗長で扱いが面倒に見えましたので、このコードでは newHoge のような形式にはしておらず、質問に対する正解のコードにはなっていません。ただし、似た変換を行う場合は参考になると思いますので、質問に挙げられている newHoge の形式にしたい場合、このコードを元に書き換えてみるのも良いかもしれません。

JavaScript

1function convert(obj) { 2 var result = {}; 3 for (var idx in obj) { 4 var category1 = obj[idx]["category1"]; 5 var category2 = obj[idx]["category2"]; 6 var item = obj[idx]["item"]; 7 if (undefined === result[category1]) { 8 result[category1] = {}; 9 result[category1][category2] = [item]; 10 } 11 else if (undefined === result[category1][category2]) { 12 result[category1][category2] = [item]; 13 } 14 else { 15 result[category1][category2].push(item); 16 } 17 } 18 return result; 19}

ブラウザなりで上記のコードを使って実際に hoge のデータを変換してみると解ると思いますが、category を直接プロパティとして持たせる形に変換しています。JavaScript であれば for in の形式でプロパティの走査ができますので、category の列挙もこれでできますし、この手のデータオブジェクトをコンテナとして使うだけであれば、この構造でも大丈夫なのではないでしょうか?ただし、後続処理で生成したオブジェクトに不必要なプロパティが付与されるような状況があれば、この方法は使えなくなるのでご注意ください。

以上、ご参考になれば幸いです。

投稿2016/01/07 19:41

ps13zier

総合スコア433

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問