質問でお求めの回答とは異なりますが、以下のようにするのがよいと思います。
(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
とします。data
は area
と prefectures
を持つオブジェクトです。
(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 08:42
退会済みユーザー
2021/12/17 10:26