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

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

詳細はこちら
for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

JavaScript

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

3回答

771閲覧

JavaScriptで多次元配列をfor文でデータ整形したい

s15ak071

総合スコア13

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

JavaScript

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2019/12/17 07:53

編集2019/12/17 08:10

前提・実現したいこと

現在、プログラミングをはじめたばかりでJavaScriptのフレームワークのVue.jsを利用しています。
Vue.jsの質問ではないのですが多次元配列?の場合、データの更新の仕方のif文分岐に迷っています。

やりたいことは記事投稿todoアプリ作ってみてるんですが
担当者ごとに記事内容と、タイトルをまとめて表示させたいです。

Vue.jsで他にもいろいろなやり方があるとは思いますが、そもそもデータの整形で以下のようなレスポンスがある場合に
再度データを加工する時のfor文の動きを勉強したくて、元データを修正する以外でデータの形の再整形を検討しています。

APIのレスポンス

[ {id:123, title:"title1", content:"content1", user: { account_name:"Tom", email:"tom@mail.com"}}, {id:124, title:"title2", content:"content2", user: { account_name:"Tom", email:"tom@mail.com"}}, {id:125, title:"title3", content:"content3", user: { account_name:"Tom", email:"tom@mail.com"}}, {id:126, title:"title1", content:"content1", user: { account_name:"Sam", email:"sam@mail.com"}}, ]

期待出力結果
※とりあえずaccount_nameの重複を削除して、titleとcontentだけまとめて取得したい

[ { account_name: "Tom", article: [ { title:"title1", content:"content1"}, { title:"title2", content:"content2"}, { title:"title3", content:"content3"}, ] }, { account_name: "Sam", article: [ { title:"title1", content:"content1"}, ] }, ]

いろいろやってみたのですが
①for文で名前の重複削除しても、userのaccount_nameを外にだす、ネストの構造の入れ替えを回すやり方がわからない
②①ができても、titleとcontentをTomとSamに紐づかせる方法がわからない

解答者さんなら、どのようにfor文で加工処理を回すのか質問したいです!
あいまいですいません

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

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

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

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

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

yambejp

2019/12/17 08:01 編集

データ変換後idやemailはいらないですか?
s15ak071

2019/12/17 08:09

コメントありがとうございます! とりあえずいらないです!整形の方針をしりたいだけなので!
guest

回答3

0

forで書く方法があると思いますが、reduceで書いてみました。
あまり整形得意でないので、参考程度に。。。

javascript

1const data = response.reduce((acc, cur) => { 2 const { id, user, ...rest } = cur; 3 const duplicated = acc.find( 4 ({ account_name }) => account_name === user.account_name 5 ); 6 if (!duplicated) { 7 acc.push({ 8 account_name: user.account_name, 9 article: [rest], 10 }); 11 } else { 12 duplicated.article.push(rest); 13 } 14 return acc; 15}, []);

投稿2019/12/17 08:31

編集2019/12/17 08:35
tutti56

総合スコア86

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

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

s15ak071

2019/12/18 01:04 編集

まったくわからなかったのでほんとに助かります! 参考になります
guest

0

こんにちは

ベストアンサー決定後に失礼します。

以下のメソッド

および、配列やオブジェクトの操作で便利なライブラリ lodash

を使ったコードを、以下に回答します。

javascript

1const articles = [ 2 { id:123, title:"title1", content:"content1", user: { account_name:"Tom", email:"tom@mail.com"} }, 3 { id:124, title:"title2", content:"content2", user: { account_name:"Tom", email:"tom@mail.com"} }, 4 { id:125, title:"title3", content:"content3", user: { account_name:"Tom", email:"tom@mail.com"} }, 5 { id:126, title:"title1", content:"content1", user: { account_name:"Sam", email:"sam@mail.com"} } 6]; 7 8 9const articlesByUsers = Object.entries( 10 _.groupBy(articles, 'user.account_name') 11 ).map(([account_name, articles]) => ({ 12 account_name, 13 articles: articles.map(a => _.pick(a, ['title', 'content'])) 14 })); 15 16 17

for 文を使わないコードなので本題からは外れますが、参考になれば幸いです。

投稿2019/12/17 12:14

編集2019/12/17 14:38
jun68ykt

総合スコア9058

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

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

s15ak071

2019/12/17 13:05

わぁ!!ありがとうございます!ほんとに嬉しいです!!!
s15ak071

2019/12/18 01:05

groupbyをしたかったんですが できるんですね!!!
jun68ykt

2019/12/18 01:17

@s15ak071さん コメントありがとうございます。 > groupbyをしたかったんですが できるんですね!!! はい。 このご質問のような場合に、lodash の _.groupBy は重宝します ????
s15ak071

2019/12/18 01:21

code penまで記載していただき!宝にします またわからなかったらjunさん聞きたいです!w
jun68ykt

2019/12/18 04:39

了解です。 ちなみに Vueは詳しくありません。今回のような感じの質問だったり、Reactの質問だとお答えできるかもしれません。
s15ak071

2019/12/18 04:42

かしこまりました!
guest

0

ベストアンサー

どのようにfor文で加工処理を回すのか

普通に回します。

ご質問のケースは、総当りしなければならないので
「オブジェクトのプロパティには一意性がある」という特徴を使い、振り分けながら候補をまとめ直す手法が使えそうです。

javascript

1var ary // レスポンス 2var candidate = {}; // 候補オブジェクトに結果を収集する 3 4// 普通に回す。 5for ( let i=0, l=ary.length; i<l; ++i ) { 6 let todoItem = ary[i]; 7 8 // 一意性のある値としても利用する 9 let account_name = todoItem.user.account_name; 10 11 // 初期化 12 if ( !candidate[account_name] ) { 13 candidate[account_name] = { 14 account_name:account_name 15 , article:[] 16 }; 17 } 18 19 // 初期化した中の配列に追加 20 candidate[account_name].article.push({ 21 title:todoItem.title 22 , content: todoItem.content 23 }); 24} 25// 結果 26console.log( Object.values(candidate) );

ブラウザのコンソールを使って試した都合で var 宣言しています。

投稿2019/12/17 08:30

AkitoshiManabe

総合スコア5434

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

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

s15ak071

2019/12/17 08:35 編集

ありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問