Reactを使って、複数の配列の情報をループの入れ子を使って出力してみます。
サンプルコード
以下のようなデータを使用します。
const units = ["illumination STARS", "L’Antica", "放課後クライマックスガールズ", "ALSTROEMERIA", "Straylight", "noctchill", "SHHis", "CoMETIK"];
const idols = [
{ "unit": "illumination STARS", "name": "櫻木真乃", "age": 16 },
{ "unit": "illumination STARS", "name": "風野灯織", "age": 15 },
{ "unit": "illumination STARS", "name": "八宮めぐる", "age": 16 },
{ "unit": "L’Antica", "name": "月岡恋鐘", "age": 19 },
{ "unit": "L’Antica", "name": "田中摩美々", "age": 18 },
{ "unit": "L’Antica", "name": "白瀬咲耶", "age": 18 },
{ "unit": "L’Antica", "name": "三峰結華", "age": 19 },
{ "unit": "L’Antica", "name": "幽谷霧子", "age": 17 },
{ "unit": "放課後クライマックスガールズ", "name": "小宮果穂", "age": 12 },
{ "unit": "放課後クライマックスガールズ", "name": "園田智代子", "age": 17 },
{ "unit": "放課後クライマックスガールズ", "name": "西城樹里", "age": 17 },
{ "unit": "放課後クライマックスガールズ", "name": "杜野凛世", "age": 16 },
{ "unit": "放課後クライマックスガールズ", "name": "有栖川夏葉", "age": 20 },
{ "unit": "ALSTROEMERIA", "name": "大崎甘奈", "age": 17 },
{ "unit": "ALSTROEMERIA", "name": "大崎甜花", "age": 17 },
{ "unit": "ALSTROEMERIA", "name": "桑山千雪", "age": 23 },
{ "unit": "Straylight", "name": "芹沢あさひ", "age": 14 },
{ "unit": "Straylight", "name": "黛冬優子", "age": 19 },
{ "unit": "Straylight", "name": "和泉愛依", "age": 18 },
{ "unit": "noctchill", "name": "浅倉透", "age": 17 },
{ "unit": "noctchill", "name": "樋口円香", "age": 17 },
{ "unit": "noctchill", "name": "福丸小糸", "age": 16 },
{ "unit": "noctchill", "name": "市川雛菜", "age": 15 },
{ "unit": "SHHis", "name": "七草にちか", "age": 16 },
{ "unit": "SHHis", "name": "緋田美琴", "age": 24 },
{ "unit": "CoMETIK", "name": "斑鳩ルカ", "age": 20 },
{ "unit": "CoMETIK", "name": "鈴木羽那", "age": 18 },
{ "unit": "CoMETIK", "name": "郁田はるき", "age": 17 }
];
unitsでループを回して、その中でidolsのループを回してunitの一致する値を表示する処理を実装してみます。
function App() {
const units = ["illumination STARS", "L’Antica", "放課後クライマックスガールズ", "ALSTROEMERIA", "Straylight", "noctchill", "SHHis", "CoMETIK"];
const idols = [
{ "unit": "illumination STARS", "name": "櫻木真乃", "age": 16 },
{ "unit": "illumination STARS", "name": "風野灯織", "age": 15 },
{ "unit": "illumination STARS", "name": "八宮めぐる", "age": 16 },
~ 略 ~
{ "unit": "CoMETIK", "name": "鈴木羽那", "age": 18 },
{ "unit": "CoMETIK", "name": "郁田はるき", "age": 17 }
];
return (
<>
{
// ユニットでループを回す
units.map((unit) =>
<section key={unit}>
<h2>{unit}</h2>
<ul>
{
// 所属ユニットのアイドルのみ追加
idols
.filter((idol) => idol.unit === unit)
.map((idol) => (
<li key={idol.name}>
{idol.name}({idol.age})
</li>
))
}
</ul>
</section>
)
}
</>
)
}
export default App
idolsのループではfilter()でunitの一致する値のみに絞り込んでからmap()で要素の作成を行っています。
リスト表示のデモページ
上記コードは1つのコンポーネントにまとめて記載しているので、いくつかのコンポーネントに分割してみます。
まずはIdol.jsxという名前でファイル名を作成して、idols部分をコンポーネントに分割します。
function Idol( {idol} ) {
return (
<li>
{idol.name}({idol.age})
</li>
)
}
export default Idol
propsでidolsのループの内容を受け取る想定です。
次にUnit.jsxを作成して、units部分をコンポーネントに分割します。
import Idol from './Idol.jsx'
function Unit( {unit, idols} ) {
return (
<section key={unit}>
<h2>{unit}</h2>
<ul>
{
// 所属ユニットのアイドルのみ追加
idols
.filter((idol) => idol.unit === unit)
.map((idol) => (
<Idol key={idol.name} idol={idol} />
))
}
</ul>
</section>
)
}
export default Unit
処理としては最初のデモから基本的に変わっていません。
propsでunitsのループ内容と、Idolのコンポーネントで使用するidolsのデータを受け取っています。
App.jsxの内容をUnitのコンポーネントを使用する形に変更します。
import Unit from './Unit.jsx'
function App() {
const units = ["illumination STARS", "L’Antica", "放課後クライマックスガールズ", "ALSTROEMERIA", "Straylight", "noctchill", "SHHis", "CoMETIK"];
const idols = [
{ "unit": "illumination STARS", "name": "櫻木真乃", "age": 16 },
{ "unit": "illumination STARS", "name": "風野灯織", "age": 15 },
{ "unit": "illumination STARS", "name": "八宮めぐる", "age": 16 },
~ 略 ~
{ "unit": "CoMETIK", "name": "鈴木羽那", "age": 18 },
{ "unit": "CoMETIK", "name": "郁田はるき", "age": 17 }
];
return (
<>
{
// ユニットでループを回す
units.map((unit) =>
<Unit key={unit} unit={unit} idols={idols} />
)
}
</>
)
}
export default App
これで最初のデモと同じ表示のまま、コンポーネントの分割が行えました。
コメントが承認されるまで時間がかかります。