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

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

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

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

配列

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

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

1回答

895閲覧

JavaScript 配列をswitchにより展開時、一番目のみに特定のテキストを表示させたい React.js

sarukawa

総合スコア6

JavaScript

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

配列

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

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

1クリップ

投稿2021/12/17 02:07

編集2021/12/17 08:39

<実現したいこと>
下記1が実装したい簡易的な画面です。
下記2が現状の画面です。

全国  関東エリア(kantoArea)   東京都   神奈川県   千葉県   埼玉県  中部エリア(chubuArea)   愛知県   岐阜県   三重県 . .

全国  関東エリア   東京都  関東エリア   神奈川県  関東エリア   千葉県  関東エリア   埼玉県 . .

上記のように、kantoArea配列とすると
kandtoArea[0]には東京都,[1]には神奈川県、、
という具合にデータが格納されているとします。

各都道府県には更にオブジェクトとして、areaプロパティがあり、関東エリアの都道府県の場合は、

area: "kantoArea"

のように格納されています。

これらを普通に展開すると、

現状のように全てに「関東エリア」 が付いて表示されてしまいます。

例えばswitch文により、

case kantoArea: const kanto = data.map((item)=>{ return( // item.nameは都道府県名 <span>{item.name}</span> ) return ( <span>関東エリア</span> <span>{kanto}</span> ) case chubuArea: ...

のように書く場合、kantoAreaの1番目の都道府県(=東京都)の文頭のみ、「関東エリア」と表示させてい場合、
どのような実装をすれば良いのでしょうか。

"datas": [ { "name": "東京", "area": "kanto" }, { "name": "千葉", "area": "kanto" }, { "name": "神奈川", "area": "kanto" }, { "name": "愛知", "area": "chubu" }, { "name": "岐阜", "area": "chubu" }, { "name": "大阪", "area": "kansai" }, { "name": "兵庫", "area": "kansai" }, { "name": "京都", "area": "kansai" } ]

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

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

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

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

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

guest

回答1

0

ベストアンサー

質問でお求めの回答とは異なりますが、以下のようにするのがよいと思います。

(1)都道府県の配列が以下のようなものであるとします。

[ { name: '東京都', area: 'kantoArea' }, { name: '神奈川県', area: 'kantoArea' }, { name: '千葉県', area: 'kantoArea' }, { name: '埼玉県', area: 'kantoArea' }, { name: '愛知県', area: 'chubuArea' }, { name: '岐阜県', area: 'chubuArea' }, { name: '三重県', area: 'chubuArea' } ]

(2)(1)の配列から、以下のような areaごとにグルーピングした配列を作ります。

[ { area: 'kantoArea', prefectures: [ '東京都', '神奈川県', '千葉県', '埼玉県' ] }, { area: 'chubuArea', prefectures: [ '愛知県', '岐阜県', '三重県' ] } ]

(3) 上記のareaごとにグルーピングした配列をmap して、mapに与える関数の引数名を仮にdataとします。dataareaprefecturesを持つオブジェクトです。

(4) (3)の各data をpropとして受け取るコンポーネントを 例えば

<Area data={data} />

というものとして作ります。

(5) Area コンポーネントの中では、prop data

 ・name プロパティを使って、 関東エリア(kantoArea)の部分の<span>を作り、
prefecturesプロパティを mapで展開してそのエリアが含む都道府県の各<span>を作ります。

追記

以下は、上記の考え方によるコードの一例です。groupByAreaという関数によって、エリアごとにグルーピングした配列を作成します。

jsx

1const areaNames = { 2 kanto: '関東エリア', 3 chubu: '中部エリア', 4 kansai: '関西エリア', 5}; 6 7const datas = JSON.parse(`[ 8 { "name": "東京", "area": "kanto" }, 9 { "name": "千葉", "area": "kanto" }, 10 { "name": "神奈川", "area": "kanto" }, 11 { "name": "愛知", "area": "chubu" }, 12 { "name": "岐阜", "area": "chubu" }, 13 { "name": "大阪", "area": "kansai" }, 14 { "name": "兵庫", "area": "kansai" }, 15 { "name": "京都", "area": "kansai" } 16]`); 17 18const groupByArea = prefectureDatas => 19 prefectureDatas.reduce((ary, { name, area }, i) => { 20 const last = ary.length > 0 ? ary[ary.length-1] : null; 21 if (!last || last.area !== area) 22 ary.push({ area, prefectures: [name] }); 23 else 24 last.prefectures.push(name); 25 return ary; 26 }, []); 27 28 29const Prefecture = ({ name }) => ( 30 <span className="prefecture">{name}</span> 31); 32 33const Area = ({ data: { area, prefectures }}) => ( 34 <div className="area-box"> 35 <span className="area">{areaNames[area]}</span> 36 {prefectures.map(pref => <Prefecture key={pref} name={pref} /> )} 37 </div> 38); 39 40const App = () => { 41 const areaDatas = groupByArea(datas); 42 console.log(areaDatas); 43 44 return ( 45 <div> 46 {areaDatas.map(data => <Area key={data.area} data={data} />)} 47 </div> 48 ); 49} 50 51 52const rootElement = document.getElementById("root"); 53ReactDOM.render(<App />, rootElement); 54

投稿2021/12/17 03:58

編集2021/12/17 13:58
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

sarukawa

2021/12/17 08:42

ありがとうございます。 JSONの構造を変えるという事ですね。 追記をしたのですが、現状追記のようなデータ構造になっているとしまして、 配列を展開した際に、kanto, chubu, kansaiそれぞれの1番目のみに「関東エリア」「中部エリア」「関西エリア」を頭に付けたい場合はどのような手立てがありますでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問