teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

テキスト追加

2021/12/17 13:58

投稿

退会済みユーザー
answer CHANGED
@@ -49,4 +49,68 @@
49
49
  (5) `Area` コンポーネントの中では、prop `data`の
50
50
 
51
51
   ・`name` プロパティを使って、` 関東エリア(kantoArea)`の部分の<span>を作り、
52
-  ・`prefectures`プロパティを mapで展開してそのエリアが含む都道府県の各<span>を作ります。
52
+  ・`prefectures`プロパティを mapで展開してそのエリアが含む都道府県の各<span>を作ります。
53
+
54
+
55
+ ### 追記
56
+
57
+ 以下は、上記の考え方によるコードの一例です。`groupByArea`という関数によって、エリアごとにグルーピングした配列を作成します。
58
+
59
+ ```jsx
60
+ const areaNames = {
61
+ kanto: '関東エリア',
62
+ chubu: '中部エリア',
63
+ kansai: '関西エリア',
64
+ };
65
+
66
+ const datas = JSON.parse(`[
67
+ { "name": "東京", "area": "kanto" },
68
+ { "name": "千葉", "area": "kanto" },
69
+ { "name": "神奈川", "area": "kanto" },
70
+ { "name": "愛知", "area": "chubu" },
71
+ { "name": "岐阜", "area": "chubu" },
72
+ { "name": "大阪", "area": "kansai" },
73
+ { "name": "兵庫", "area": "kansai" },
74
+ { "name": "京都", "area": "kansai" }
75
+ ]`);
76
+
77
+ const groupByArea = prefectureDatas =>
78
+ prefectureDatas.reduce((ary, { name, area }, i) => {
79
+ const last = ary.length > 0 ? ary[ary.length-1] : null;
80
+ if (!last || last.area !== area)
81
+ ary.push({ area, prefectures: [name] });
82
+ else
83
+ last.prefectures.push(name);
84
+ return ary;
85
+ }, []);
86
+
87
+
88
+ const Prefecture = ({ name }) => (
89
+ <span className="prefecture">{name}</span>
90
+ );
91
+
92
+ const Area = ({ data: { area, prefectures }}) => (
93
+ <div className="area-box">
94
+ <span className="area">{areaNames[area]}</span>
95
+ {prefectures.map(pref => <Prefecture key={pref} name={pref} /> )}
96
+ </div>
97
+ );
98
+
99
+ const App = () => {
100
+ const areaDatas = groupByArea(datas);
101
+ console.log(areaDatas);
102
+
103
+ return (
104
+ <div>
105
+ {areaDatas.map(data => <Area key={data.area} data={data} />)}
106
+ </div>
107
+ );
108
+ }
109
+
110
+
111
+ const rootElement = document.getElementById("root");
112
+ ReactDOM.render(<App />, rootElement);
113
+
114
+ ```
115
+
116
+ - codepen ???? [tera: 374247#2](https://codepen.io/kilesa/pen/RwLVjbR?editors=0111)

1

テキスト修正

2021/12/17 13:58

投稿

退会済みユーザー
answer CHANGED
@@ -37,16 +37,16 @@
37
37
  ]
38
38
  ```
39
39
 
40
- (3) 上記の`area`ごとにグルーピングした配列を`map` して、mapに与える関数の引数名を`area`とします。
40
+ (3) 上記の`area`ごとにグルーピングした配列を`map` して、mapに与える関数の引数名を仮に`data`とします。`data` は `area`と `prefectures`を持つオブジェクトです。
41
41
 
42
- (4) (3)の各`area` をpropとして受け取るコンポーネントを 例えば
42
+ (4) (3)の各`data` をpropとして受け取るコンポーネントを 例えば
43
43
 
44
- `<Area data={area} />`
44
+ `<Area data={data} />`
45
45
 
46
46
  というものとして作ります。
47
47
 
48
48
 
49
- (5) `Area` コンポーネントの中では、prop `data`で渡される `area`
49
+ (5) `Area` コンポーネントの中では、prop `data`の
50
50
 
51
51
   ・`name` プロパティを使って、` 関東エリア(kantoArea)`の部分の<span>を作り、
52
52
   ・`prefectures`プロパティを mapで展開してそのエリアが含む都道府県の各<span>を作ります。