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

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

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

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

配列

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

React.js

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

Q&A

解決済

1回答

820閲覧

map関数の使い方について

karage

総合スコア4

JavaScript

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

配列

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

React.js

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

0グッド

0クリップ

投稿2021/10/27 08:28

編集2021/10/27 08:34

以下のような配列の値を決められたHTML構造で表示させたいです。
(HTML構造の変更は仕様により不可とさせて下さい)

.grid-innerの中の要素は「div.title要素」と「ul要素」の1セットですが、複数セット入ることもあるので、
添字か何かで指定できたらいいなと考えています。

■ うまくいってないところ
.map関数がうまく動いていない。
添字をそのままは使えないようなので、sliceメソッドを使った

list.slice(0).children.map

・無駄が多いと思うので、繰り返しをうまく活用したい。

よろしくお願いいたします。

react

1//配列はlistという変数にします。 2return ( 3 <div class="grid"> 4 <div class="grid-inner"> 5 <div className="title"> 6 <a href={list[0]._id}>{list[0].name}</a> 7 </div> 8 <ul className="footer-category-links"> 9 {list.slice(0).children.map((e) => ( 10 <li key={e._id}><a href={e._id}>{e.name}</a></li> 11 ))} 12 </ul> 13 <div className="title"> 14 <a href={list[1]._id}>{list[1].name}</a> 15 </div> 16 <ul className="footer-category-links"> 17 {list.slice(1).children.map((e) => ( 18 <li key={e._id}><a href={e._id}>{e.name}</a></li> 19 ))} 20 </ul> 21 </div> 22 <div class="grid-inner"> 23 <div className="title"> 24 <a href={list[2]._id}>{list[2].name}</a> 25 </div> 26 <ul className="footer-category-links"> 27 {list.slice(2).children.map((e) => ( 28 <li key={e._id}><a href={e._id}>{e.name}</a></li> 29 ))} 30 </ul> 31 </div> 32 </div> 33)
[ { _id: '/a', children: [ {_id: '/a/a', name: 'A/A'} {_id: '/a/b', name: 'A/B'} {_id: '/a/c', name: 'A/C'} {_id: '/a/d', name: 'A/D'} ], name: 'A' } {_id: '/b', children: Array(4), name: 'B'} {_id: '/c', children: Array(7), name: 'C'} {_id: '/d', children: Array(7), name: 'D'} {_id: '/e', children: Array(9), name: 'E'} {_id: '/f', children: Array(0), name: 'F'} {_id: '/g', children: Array(12), name: 'G'} {_id: '/h', children: Array(9), name: 'H'} ]

HTML

1<dvi class="grid"> 2 <div class="grid-inner"> 3 <div className="title"> 4 <a href="/a">A</a> 5 </div> 6 <ul> 7 <li> 8 <a href="/a/a">AA</a> 9 </li> 10 <li> 11 <a href="/a/b">AB</a> 12 </li> 13 <li> 14 <a href="/a/c">AC</a> 15 </li> 16 <li> 17 <a href="/a/d">AD</a> 18 </li> 19 </ul> 20 <div className="title"> 21 <a href="/b">B</a> 22 </div> 23 <ul> 24 <li> 25 <a href="/b/a">BA</a> 26 </li> 27 <li> 28 <a href="/b/b">BB</a> 29 </li> 30 <li> 31 <a href="/b/c">BC</a> 32 </li> 33 <li> 34 <a href="/b/d">BD</a> 35 </li> 36 </ul> 37 </div> 38 <div class="grid-inner"> 39 <div className="title"> 40 <a href="/c">C</a> 41 </div> 42 <ul> 43 <li> 44 <a href="/c/a">CA</a> 45 </li> 46 <li> 47 <a href="/c/b">CB</a> 48 </li> 49 <li> 50 <a href="/c/c">CC</a> 51 </li> 52 <li> 53 <a href="/c/d">CD</a> 54 </li> 55 <li> 56 <a href="/c/e">CE</a> 57 </li> 58 <li> 59 <a href="/c/f">CF</a> 60 </li> 61 <li> 62 <a href="/c/g">CG</a> 63 </li> 64 </ul> 65 </div> 66 // 以下defghは省略 67</dvi>

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

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

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

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

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

guest

回答1

0

ベストアンサー

xs.map(f)は配列xsのすべての要素に対して関数fを適用した結果の配列を返します。
言い換えれば、xsのすべての要素に対してf(xs[0]), f(xs[1]), ...と適用した結果の配列を返します。
具体的には、以下のように使います。

js

1const xs = [0, 1, 2] 2const ys = xs.map(x => x + 1) // xsのすべての要素に1を足す 3// ys は [1, 2, 3]

一方、xs.slice(n)は配列xsn番目より後の要素を返します。

js

1const xs = [0, 1, 2, 3, 4] 2const ys = xs.slice(2) // xsの2番目より後の要素=3番目から最後まで 3// ys は [2, 3, 4]

したがって、list.slice(0).children.maplist.slice(0)が配列(中身は空[])なのでchildrenundefinedになってしまい、エラーが出たのではないかと思います。
list[0].children.mapでいいのではないでしょうか。


以上の話を踏まえた上で、実現したいことはlistの要素を2つづつ<div class="grid-inner">〜</div>に入れるということでよろしいでしょうか。であれば、まずlistの要素を2つづつ取り出してlist_by_2という配列にし、その配列をArray.prototype.mapで操作していきましょう。

「配列の要素を2つづつ取り出して配列にする」ために「配列をn個づつに分割する」関数を定義します。
JSで配列をn個ずつに分割 - Qiitaのコードを使っています。

js

1const split = (array, n) => array.reduce((a, c, i) => i % n == 0 ? [...a, [c]] : [...a.slice(0, -1), [...a[a.length - 1], c]], [])

これをlistに適用すると、[ [{...}, {...}], [{...}, {...}], ... ]listの要素が2つづつ配列に入った配列になります。そしてlist_by_2.map(items => ...)items[{...}, {...}]となりますから、再びitems.map(item => ...)とすることでitem{_id: ..., children: ..., name: ...}となります。

そんな感じで書いていくと、以下のようになると思います。

jsx

1// from: https://qiita.com/guttyar2213/items/46230300c5100a06198c 2const split = (array, n) => array.reduce((a, c, i) => i % n == 0 ? [...a, [c]] : [...a.slice(0, -1), [...a[a.length - 1], c]], []) 3 4const Grid = (props) => { 5 // list_by_2: [{...}, {...}, ...] -> [ [{...}, {...}], [{...}, {...}], ... ] 6 const list_by_2 = split(list, 2) 7 return ( 8 <div className="grid"> 9 {list_by_2.map(items => ( // ​itemsは[{...}, {...}] 10 <div className="grid_inner"> 11​ items.map(item => ( 12<div className="title"> 13<a href={item._id}>{item.name}</a> 14</div> 15<ul className="footer-category-links"> 16{item.children.map(({_id, name}) => ( // child => ...の代わりに ({_id, name}) => ...と分割代入しています 17<li key={_id}><a href={_id}>{name}</a></li> 18)} 19</ul> 20 ) 21 </div> 22)} 23</div> 24) 25}

投稿2021/10/27 09:16

編集2021/10/30 11:52
fj68

総合スコア752

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問