🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JavaScript

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

Q&A

解決済

4回答

2931閲覧

[javascript] ネストの深いオブジェクトをフラットな連想配列に変換したい

TuTettuuu

総合スコア12

JavaScript

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

1グッド

0クリップ

投稿2021/01/14 23:41

編集2021/01/14 23:42

前提・実現したいこと

ネストの深いオブジェクトをフラットな連想配列に変換したい

具体的には

{ '1/1': { 1000: { 'a': 0, 'b': 0, } }, '1/2': { 1000: { 'a': 0, 'b': 0, } }, };

[ { "date": "1/1", "code": "1000", "item": "a", "value": 0 }, { "date": "1/1", "code": "1000", "item": "b", "value": 0 }, { "date": "1/2", "code": "1000", "item": "a", "value": 0 }, { "date": "1/2", "code": "1000", "item": "b", "value": 0 } ]

に変換したいです。

発生している問題・エラーメッセージ

よいところまではいってる気がするのですが、配列のIndexが邪魔してできません。。。

js

1const obj = { 2 '1/1': { 3 1000: { 4 'a': 0, 5 'b': 0, 6 } 7 }, 8 '1/2': { 9 1000: { 10 'a': 0, 11 'b': 0, 12 } 13 }, 14}; 15 16const res = Object.entries(obj).map(([date, dateValues]) => { 17 return { 18 ...Object.entries(dateValues).map(([code, codeValues]) => { 19 return { 20 ...Object.entries(codeValues).map(([item, itemValue]) => { 21 return { 22 date, 23 code, 24 item, 25 value: itemValue, 26 }; 27 }), 28 }; 29 }), 30 }; 31}); 32 33 34console.log(res) 35 36// [{ 37// "0": { 38// "0": { 39// "date": "1/1", 40// "code": "1000", 41// "item": "a", 42// "value": 0 43// }, 44// "1": { 45// "date": "1/1", 46// "code": "1000", 47// "item": "b", 48// "value": 0 49// } 50// } 51// }, { 52// "0": { 53// "0": { 54// "date": "1/2", 55// "code": "1000", 56// "item": "a", 57// "value": 0 58// }, 59// "1": { 60// "date": "1/2", 61// "code": "1000", 62// "item": "b", 63// "value": 0 64// } 65// } 66// }]

どうすればよいですか?

A_kirisaki👍を押しています

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

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

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

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

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

guest

回答4

0

ベストアンサー

フラットにしたいなら map 使うより reduce 使った方がいいです。

JavaScript

1const res = Object.entries(obj).reduce((result, [key1, value1]) => { 2 const result2 = Object.entries(value1).reduce((result2, [key2, value2]) => { 3 const items = Object.entries(value2).map(([key3, value3]) => ({ 4 date: key1, 5 code: key2, 6 item: key3, 7 value: value3, 8 })); 9 10 result2.push(...items); 11 return result2; 12 }, []); 13 14 result.push(...result2); 15 return result; 16}, []); 17 18console.log(res);

投稿2021/01/15 00:48

draq

総合スコア2577

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

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

TuTettuuu

2021/01/15 01:08

なるほど、、勉強になります。
guest

0

const data={ '1/1': { 1000: { 'a': 0, 'b': 0, } }, '1/2': { 1000: { 'a': 0, 'b': 0, } }, }; let item,value,date,code; const res=Object.entries(data).map( x=>Object.entries((date=x[0],x[1])).map( x=>Object.entries((code=x[0],x[1])).map( x=>(item=x[0],value=x[1],{item,value,code,date}) ) ).flat() ).flat(); console.log(res);

投稿2021/01/15 01:14

編集2021/01/15 01:17
yambejp

総合スコア116661

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

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

0

indexが邪魔であればObject.entries(~)で回さずに、Object.keys(~)で回した方が良いかもですね。

js

1Object.keys(obj).forEach((date) => { 2 Object.keys(obj[date]).forEach((code) => { 3 Object.keys(obj[date][code]).forEach((item) => { 4 console.log(obj[date][code][item]); // value部分 5 }); 6 }); 7});

私の方でも検証コードを書いて動く事は確認済みなので頑張ってみて下さい。

投稿2021/01/15 00:38

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

連想配列ではなく、配列を作ってそこに格納する形でどうでしょう?

js

1const obj = { 2 '1/1': { 3 1000: { 4 'a': 0, 5 'b': 0, 6 } 7 }, 8 '1/2': { 9 1000: { 10 'a': 0, 11 'b': 0, 12 } 13 }, 14}; 15 16let result = []; 17const res = Object.entries(obj).forEach(([date, dateValues]) => { 18 Object.entries(dateValues). forEach(([code, codeValues]) => { 19 Object.entries(codeValues). forEach(([item, itemValue]) => { 20 result.push({ 21 date, 22 code, 23 item, 24 value: itemValue, 25 }); 26 }) 27 }) 28});

投稿2021/01/15 00:31

nekoniki

総合スコア2411

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問