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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Next.js

Next.jsは、Reactを用いたサーバサイドレンダリングなどを行う軽量なフレームワークです。Zeit社が開発しており、nextコマンドでプロジェクトを作成することにより、開発環境整備が整った環境が即時に作成できます。

JavaScript

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

React.js

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

Q&A

解決済

1回答

261閲覧

React if文を用いて配列の前半部分だけ表示、後半部分だけ表示をしたい

black-ddd

総合スコア74

Next.js

Next.jsは、Reactを用いたサーバサイドレンダリングなどを行う軽量なフレームワークです。Zeit社が開発しており、nextコマンドでプロジェクトを作成することにより、開発環境整備が整った環境が即時に作成できます。

JavaScript

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

React.js

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

0グッド

0クリップ

投稿2022/06/27 01:15

編集2022/06/27 07:50

現在、Reactでのwebサイト制作をしております。
困っている点として、表示したい配列データのindexの前半のみを表示する領域と
indexの後半のみを表示する領域で別々で表示してあげたいです。
また、こちらの二つをflexで2列にするのですが、必ず左側を1つ多く表示させたいです。

1.左用、右用にそれぞれmapを回して一旦配列の全データを2個出力
2.左ではindexの総数の半分以下のデータが表示されるようにする
3.右ではindexの総数の半分以上のデータが表示されるようにする
※総数が奇数の場合は左に寄せる、偶数の場合は半々にする

この2.3の工程の式をご教授いただければ幸いです。

parentComponent.tsx

1import { Accordion } from "src/components/layouts/common/accordionQuestion"; 2import "react-responsive-carousel/lib/styles/carousel.min.css"; 3 4const accordionItems = { 5 accordionList: [ 6 { 7 title: "", 8 text: "", 9 }, 10 { 11 title: "", 12 text: "", 13 }, 14 { 15 title: "", 16 text: "", 17 }, 18 { 19 title: "", 20 text: "", 21 }, 22 { 23 title: "", 24 text: "", 25 }, 26 { 27 title: "", 28 text: "", 29 }, 30 { 31 title: "", 32 text: "" 33 }, 34 { 35 title: "", 36 text: "", 37 }, 38 { 39 title: "", 40 text: "" 41 }, 42 { 43 title: "", 44 text: "", 45 }, 46 { 47 title: "", 48 text: "", 49 }, 50 ], 51}; 52 53export function Page() { 54 return ( 55 <div> 56 <Accordion accordionList={accordionItems.accordionList} /> 57 </div> 58 ); 59} 60

childComponent.tsx

1import classes from "./index.module.scss"; 2import React from "react"; 3import { AccordionQuestionData } from "src/components/layouts/common/accordionQuestionData"; 4 5interface accordionData { 6 title: string; 7 text: string; 8} 9interface Props { 10 accordionList: accordionData[]; 11} 12 13export const Accordion: React.VFC<Props> = React.memo(function AccordionItem( 14 props: Props 15) { 16 return ( 17 <div className={classes.position}> 18 <h3 className={classes.title}>よくある質問</h3> 19 <div className={classes.flexBox}> 20 <div className={classes.flex}> 21 {[...props.accordionList].map((items, index) => { 22 if(index) { 23 return ( 24 <AccordionQuestionData 25 key={index} 26 title={items.title} 27 text={items.text} 28 /> 29 ); 30 } 31 })} 32 </div> 33 <div className={classes.flex}> 34 {[...props.accordionList].map((items, index) => { 35 if(index) { 36 return ( 37 <AccordionQuestionData 38 key={index} 39 title={items.title} 40 text={items.text} 41 /> 42 ); 43 } 44 })} 45 </div> 46 </div> 47 </div> 48 ); 49}); 50

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

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

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

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

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

maisumakun

2022/06/27 02:20

> こちらの二つをflexで2列にするのですが、必ず左側を1つ多く表示させたいです。 偶数個だった場合はどうするのですか?
black-ddd

2022/06/27 02:27

説明不足ですみません。 総数が偶数個だと半々で表示されるようにしたいです。 総数が奇数個だった場合左を1つ多い状態にして必ず左側は偶数、右側は奇数という表示を取りたいです
maisumakun

2022/06/27 02:40

> 総数が奇数個だった場合左を1つ多い状態にして必ず左側は偶数、右側は奇数という表示を取りたいです 4n+1個の場合、「左を1つ多い状態」と「左側は偶数、右側は奇数」が両立しませんが、どちらが正しいのですか?
black-ddd

2022/06/27 02:49

左を1つ多い状態が正しいです! 総数を半分にする時に奇数偶数の概念が必要だと思ったので混ざってしまいましたすみません。 総数が9個数だった場合indexの0~4までが左、5~8が右のような形にしたいです。
guest

回答1

0

ベストアンサー

配列にsplice()を使用すると簡単に分けることができるので、

TypeScript

1export const Accordion: React.VFC<Props> = React.memo(function AccordionItem( 2 props: Props 3) { 4 // classesを分割代入 5 const {position, title, flexBox, flex} = classes; 6 7 // accordionListをコピーする 8 const accordionListArray = [...props.accordionList]; 9 10 // 分割点を決める 11 const half = Math.ceil(accordionListArray.length / 2); 12 13 // 配列を左右に分ける 14 const leftList = accordionListArray.splice(0, half); 15 const rightList = accordionListArray.splice(-half); 16 17 return ( 18 <div className={position}> 19 <h3 className={title}>よくある質問</h3> 20 <div className={flexBox}> 21 <div className={flex}> 22 // 左側のデータ 23 {leftList.map((items, index) => { 24 // itemsを分割代入 25 const {title, text} = items; 26 27 return ( 28 <AccordionQuestionData 29 key={index} 30 title={title} 31 text={text} 32 /> 33 ); 34 })} 35 </div> 36 <div className={flex}> 37 // 右側のデータ 38 {rightList.map((items, index) => { 39 // itemsを分割代入 40 const {title, text} = items; 41 42 return ( 43 <AccordionQuestionData 44 key={index} 45 title={title} 46 text={text} 47 /> 48 ); 49 })} 50 </div> 51 </div> 52 </div> 53 ); 54});

のようにできると思うのですが、挙動はいかがでしょうか?

分割点を決める際に配列要素数が奇数だった場合、小数点になるのですが、splice()に小数点を使用すると自動的に切り上げられ片方が多くなるようになっているので、それを使用して片方に偏ったデータが作れます。

投稿2022/08/30 05:43

nomari

総合スコア94

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

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

black-ddd

2022/09/01 09:53

回答遅れて申し訳ございません! 理想の挙動になりました。 splice()の知識がまだまだだったので勉強になりました、ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問