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

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

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

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

配列

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

Q&A

解決済

2回答

1156閲覧

slice()で返り値がundefinedになってしまう

samepanda

総合スコア14

JavaScript

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

配列

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

0グッド

0クリップ

投稿2020/12/14 13:28

現在、JavaScriptの練習でページネーションを作成しています。(jquery無し)
構成については、配列(items)からslice()によって5個ずつ要素を取り出し、得られた要素をそれぞれのページに表示するというものです。
しかし、関数(slice_array)を実行すると、新しい配列自体はできるのですが、要素がundefinedになってしまいます。
原因がわかる方がいましたら、教えていただきたいです。

以下コード

HTML

1<p class="title">Menu</p> 2 <ul id="page_count"></ul> 3 <ul id="contents"></ul> 4 <ul class="pagination"> 5 <li id="prev">&lt;</li> 6 <li>1</li> 7 <li>2</li> 8 <li>3</li> 9 <li id="next">&gt;</li> 10 </ul>

css

1body { 2 font-size: 20px; 3 text-align: center; 4 margin: 0 auto; 5} 6 7.pagination { 8 display: flex; 9} 10 11li { 12 list-style: none; 13 margin-left: 5px; 14 margin: 0 auto; 15} 16 17.title { 18 font-size: 30px; 19}

js

1const items = [ 2 {"id": 1, "name": "サラダ油"}, 3 {"id": 2, "name": "オリーブオイル"}, 4 {"id": 3, "name": "酢"}, 5 {"id": 4, "name": "ごまドレ"}, 6 {"id": 5, "name": "鶏ガラ"}, 7 {"id": 6, "name": "小麦粉"}, 8 {"id": 7, "name": "ごま油"}, 9 {"id": 8, "name": "塩"}, 10 {"id": 9, "name": "胡椒"}, 11 {"id": 10, "name": "片栗粉"}, 12 {"id": 11, "name": "ショートケーキ"}, 13 {"id": 12, "name": "チーズケーキ"}, 14 {"id": 13, "name": "プリン"}, 15 {"id": 14, "name": "パフェ"}, 16 {"id": 15, "name": "アップルパイ"}, 17 {"id": 16, "name": "クッキー"}, 18 {"id": 17, "name": "チョコレートケーキ"}, 19 {"id": 18, "name": "フルーツ"}, 20 ]; 21 22 23 const pagination = () => { 24 const li = document.createElement('li'); 25 const page_count = document.getElementById('page_count'); 26 let current_page = 1; 27 const contents = 5; 28 const pages = Math.ceil(items.length/5); 29 30 page_count.appendChild(li).innerHTML = current_page + "/" + pages + " " + "page"; 31 32 const slice_array = (array, number) => { 33 const length = Math.ceil(array.length/number); 34 return new Array(length).fill().map((_, i) => { 35 array.slice(i * number, (i + 1) * number); 36 }); 37 } 38 39 slice_array(items, contents); 40 41 console.log(slice_array(items, contents)); //ここでundefinedになってしまいます。 42 43 } 44 45 window.onload = () => { 46 pagination(); 47 }

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

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

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

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

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

guest

回答2

0

リファレンスのとおり、=>の後に書くのは、式かブロックです。
式を書くとその値がreturnされますが、ブロックの場合は単に実行されるだけなので、普通の関数と同じく、ブロック中でreturnしないとデフォルトの値はundefinedです(リファレンス)。

式が、オブジェクトリテラルだと、構文的にブロックと区別つかないので、括弧で囲む必要があります。

投稿2020/12/14 14:57

otn

総合スコア85901

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

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

samepanda

2020/12/14 15:23

ご回答ありがとうございます。 式でもオブジェクトリテラルとブロックの違いについて十分に理解していなかったために、予期していない動作になったのだと思います。 改めてありがとうございました。
guest

0

ベストアンサー

これは JavaScript のアロー関数のわかりにくいところの一つなんですが、

JavaScript

1const f = (x) => x;

と書いた場合 f はきちんと x を返す関数になりますが

JavaScript

1const f = (x) => { x };

は常に undefined を返すようになってしまいます。これを直すには

JavaScript

1const f = (x) => { return x };

と明示的に return しなければいけません。というわけで

JavaScript

1 const slice_array = (array, number) => { 2 const length = Math.ceil(array.length/number); 3 return new Array(length).fill().map((_, i) => { 4 return array.slice(i * number, (i + 1) * number); 5 }); 6 }

とすれば直るでしょう。

投稿2020/12/14 13:38

A_kirisaki

総合スコア2853

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

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

samepanda

2020/12/14 14:06

ご回答ありがとうございます。 無事動作しました。 しかし、どうしてreturnを加えなければならないのでしょうか? MDNを確認したところ、 ``` // object リテラル式を返す場合は、本体を丸括弧 () で囲みます: params => ({foo: bar}) ``` https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Functions/Arrow_functions#Advanced_syntax とある通り、丸括弧で囲えばオブジェクトであっても、予期通り返ってくるとあるのですが。。。 もしよろしければ、ご回答お願いします。
A_kirisaki

2020/12/14 14:23

丸括弧も OK でしたね、すみません。ですが map に渡している関数、波括弧ではありませんか?
samepanda

2020/12/14 15:11

ご回答ありがとうございます。 ベストアンサーにさせていただきました。 波括弧、つまりブロックであるため丸括弧ではだめでしたね。。 オブジェクトとブロックの違いがよく理解していなかったため、誤解してしまいました。 勉強し直します! 改めてありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問