\r\n\r\n\r\n\r\n\r\n

ソート

\r\n

配列 [\"ccc\", \"dddd\", \"a\", \"bb\", \"eeeee\"]のソート結果は

\r\n

\r\n​\r\n

配列 [\"apple\", \"banana\", \"chicken\", \"doughnut\", \"egg\"]のソート結果は

\r\n

\r\n\r\n\r\n```\r\n```javascript\r\nfunction sort(array){\r\n return array.sort((a,b)=>{ return a.length > b.length ? -1 : 1} );\r\n}\r\n```\r\n\r\nここで見る限り、function sortの中に実際の処理を書いていくわけですが、最初のreturnの中にaray.sort((a,b)=>{return...\r\nといった感じでなんとreturnが連続して続いているのですが、これは関数の中に関数が入っているという解釈でよろしいのでしょうか?\r\n\r\nまた、これはいわゆるクローシャというものと関係しているのでしょうか?\r\n\r\n追記:問題文追加し忘れて板の失礼いたしました。\r\n\r\nこちらです。\r\n\r\n\r\n\r\n配列を文字列の長さの長い順でソートする関数sortを完成させてください。","answerCount":3,"upvoteCount":0,"datePublished":"2017-05-01T06:05:39.286Z","dateModified":"2022-01-12T10:55:45.698Z","suggestedAnswer":[{"@type":"Answer","text":"> 皆さんはどのようにコードを書くでしょうか?\r\n```javascript\r\nfunction sort(array){\r\n return array.sort( (a,b)=> b.length - a.length );\r\n}\r\n```\r\n\r\n> 関数の中に関数が入っているという解釈でよろしいのでしょうか?\r\n\r\nだいたいそんな理解であってますが、「高階関数」という言葉を覚えておくといいかと思います。\r\n> 高階関数(こうかいかんすう、英: higher-order function)とは、関数(手続き)を引数にしたり、あるいは関数(手続き)を戻り値とするような関数のことである。\r\n[高階関数 - Wikipedia](https://ja.wikipedia.org/wiki/%E9%AB%98%E9%9A%8E%E9%96%A2%E6%95%B0)\r\n\r\n   \r\n> 引数 \r\n> \r\ncompareFunction \r\n ソート順を定義する関数を指定します。省略された場合、配列は各要素の文字列比較に基づき辞書順にソートされます。\r\n[Array.prototype.sort() - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/sort)","dateModified":"2017-05-01T07:08:10.478Z","datePublished":"2017-05-01T07:05:25.089Z","upvoteCount":1,"url":"https://teratail.com/questions/74496#reply-117329","comment":[{"@type":"Comment","text":"高階関数ですね。覚えておきます!","datePublished":"2017-05-01T07:15:18.046Z","dateModified":"2017-05-01T07:15:18.046Z"}]},{"@type":"Answer","text":"問題文が不明ですが、「回答例」から読み取る限りでは「String 値の要素からなる配列を文字列の長い順にソートせよ」というところでしょうか。\r\n私なら次のように書きます。\r\n\r\n```JavaScript\r\nfunction lengthSort (a, b) {\r\n return String(b).length - String(a).length;\r\n}\r\n\r\nconsole.log(JSON.stringify([\"ccc\", \"dddd\", \"a\", \"bb\", \"eeeee\"].sort(lengthSort))); // [\"eeeee\",\"dddd\",\"ccc\",\"bb\",\"a\"]\r\nconsole.log(JSON.stringify([\"apple\", \"banana\", \"chicken\", \"doughnut\", \"egg\"].sort(lengthSort))); // [\"doughnut\",\"chicken\",\"banana\",\"apple\",\"egg\"]\r\n```\r\n\r\n`length` は String 型の保証とならない(配列も存在しうる)為、String 型に変換し、`JSON.stringify` でシリアライズします。\r\n\r\n### アロー関数\r\n\r\nアロー関数/関数宣言/関数式が混在していて、コード全体として統一感のないコードになっている印象を受けます。\r\nsort のコードだけ別の人が書いたコードなのでしょうか。\r\nアロー関数を使うのなら、`$(document).ready(function() {});` もアロー関数で書いた方がすっきりするのではないかと思います。\r\n\r\n### クロージャ\r\n\r\n関数の中に関数があればクロージャといえますが、「`array.sort()` 内のアロー関数」は単純な**コールバック関数**なので、クロージャならではの使い方ではないように思います。\r\n`function sort (){}` 内の return は `Array.prototype.sort` の返り値を返しているだけです。\r\n\r\n```JavaScript\r\nfunction sort (array) {\r\n return array.sort();\r\n}\r\n```\r\n\r\n上記コードにコールバック関数が付与されたところで、コードが表す意味は変わりません。\r\n\r\n### array2str() のシリアライズ\r\n\r\n本題から逸れるのでしょうが、`array2str()` の設計がどうにも気になります。\r\n配列を「配列初期化子」となる文字列に変換する事が期待されますが、配列の要素に `,` が存在するだけで出力値が不正になります。\r\n\r\n```JavaScript\r\nfunction array2str(array) {\r\n return \"[\" + array.join(\", \") + \"]\";\r\n}\r\n\r\nvar array = ['a, bb, ccc, dddd, eeeee', 'ffffff'];\r\nconsole.log(array2str(array)); // [a, bb, ccc, dddd, eeeee, ffffff]\r\nconsole.log(JSON.stringify(array)); // [\"a, bb, ccc, dddd, eeeee\",\"ffffff\"]\r\n```\r\n\r\nRe: garchomp さん","dateModified":"2017-05-01T07:38:53.336Z","datePublished":"2017-05-01T06:59:09.561Z","upvoteCount":3,"url":"https://teratail.com/questions/74496#reply-117326","comment":[{"@type":"Comment","text":"なるほど。変換するというのも大事なんですね・・・ありがとうございます!","datePublished":"2017-05-01T07:14:35.936Z","dateModified":"2017-05-01T07:14:35.936Z"}]},{"@type":"Answer","text":"> 関数の中に関数が入っているという解釈\r\n\r\nはい。そのとおりです。\r\n\r\n> クローシャというものと関係しているのでしょうか?\r\n\r\nあります。Closure クロージャですね。\r\nJavascript の無名関数はクロージャそのものです。","dateModified":"2017-05-01T06:52:36.587Z","datePublished":"2017-05-01T06:52:36.587Z","upvoteCount":0,"url":"https://teratail.com/questions/74496#reply-117324","comment":[{"@type":"Comment","text":"そうなんですね!ありがとうございます.","datePublished":"2017-05-01T07:14:02.091Z","dateModified":"2017-05-01T07:14:02.091Z"}]}],"breadcrumb":{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"トップ","url":"https://teratail.com"},{"@type":"ListItem","position":2,"name":"JavaScriptに関する質問","url":"https://teratail.com/tags/JavaScript"},{"@type":"ListItem","position":3,"name":"JavaScript","url":"https://teratail.com/tags/JavaScript"}]}}}

質問するログイン新規登録
JavaScript

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

Q&A

3回答

2054閲覧

javascriptのsort ダブルreturnについての疑問

garchomp

総合スコア128

JavaScript

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

0グッド

0クリップ

投稿2017/05/01 06:05

編集2017/05/01 07:12

0

0

codeprepの配列の練習問題の回答例に関する質問です。

現在配列の文字列のソートをやっていますが、皆さんはどのようにコードを書くでしょうか?

また、回答例では、以下のようになっていました。

html

1 2<!DOCTYPE html> 3<html> 4<head> 5<meta charset="utf-8"> 6<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script> 7<script src="index.js"></script> 8<script> 9function array2str(array) { 10 return "[" + array.join(", ") + "]"; 11} 12$(document).ready(function() { 13 $("#a1").text(array2str(sort(["ccc", "dddd", "a", "bb", "eeeee"]))); 14 $("#a2").text(array2str(sort(["apple", "banana", "chicken", "doughnut", "egg"]))); 15}); 16</script> 17</head> 18<body> 19<h1>ソート</h1> 20<p>配列 ["ccc", "dddd", "a", "bb", "eeeee"]のソート結果は</p> 21<p id="a1"/> 2223<p>配列 ["apple", "banana", "chicken", "doughnut", "egg"]のソート結果は</p> 24<p id="a2"/> 25</body> 26</html>

javascript

1function sort(array){ 2 return array.sort((a,b)=>{ return a.length > b.length ? -1 : 1} ); 3}

ここで見る限り、function sortの中に実際の処理を書いていくわけですが、最初のreturnの中にaray.sort((a,b)=>{return...
といった感じでなんとreturnが連続して続いているのですが、これは関数の中に関数が入っているという解釈でよろしいのでしょうか?

また、これはいわゆるクローシャというものと関係しているのでしょうか?

追記:問題文追加し忘れて板の失礼いたしました。

こちらです。

配列を文字列の長さの長い順でソートする関数sortを完成させてください。

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

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

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

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

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

think49

2017/05/01 06:46

そもそも、問題文が分からないのですが…。模範解答から問題文を読み取れ、という事でしょうか。
garchomp

2017/05/01 07:15

失礼いたしました。問題文追加しておきました!
guest

回答3

0

問題文が不明ですが、「回答例」から読み取る限りでは「String 値の要素からなる配列を文字列の長い順にソートせよ」というところでしょうか。
私なら次のように書きます。

JavaScript

1function lengthSort (a, b) { 2 return String(b).length - String(a).length; 3} 4 5console.log(JSON.stringify(["ccc", "dddd", "a", "bb", "eeeee"].sort(lengthSort))); // ["eeeee","dddd","ccc","bb","a"] 6console.log(JSON.stringify(["apple", "banana", "chicken", "doughnut", "egg"].sort(lengthSort))); // ["doughnut","chicken","banana","apple","egg"]

length は String 型の保証とならない(配列も存在しうる)為、String 型に変換し、JSON.stringify でシリアライズします。

アロー関数

アロー関数/関数宣言/関数式が混在していて、コード全体として統一感のないコードになっている印象を受けます。
sort のコードだけ別の人が書いたコードなのでしょうか。
アロー関数を使うのなら、$(document).ready(function() {}); もアロー関数で書いた方がすっきりするのではないかと思います。

クロージャ

関数の中に関数があればクロージャといえますが、「array.sort() 内のアロー関数」は単純なコールバック関数なので、クロージャならではの使い方ではないように思います。
function sort (){} 内の return は Array.prototype.sort の返り値を返しているだけです。

JavaScript

1function sort (array) { 2 return array.sort(); 3}

上記コードにコールバック関数が付与されたところで、コードが表す意味は変わりません。

array2str() のシリアライズ

本題から逸れるのでしょうが、array2str() の設計がどうにも気になります。
配列を「配列初期化子」となる文字列に変換する事が期待されますが、配列の要素に , が存在するだけで出力値が不正になります。

JavaScript

1function array2str(array) { 2 return "[" + array.join(", ") + "]"; 3} 4 5var array = ['a, bb, ccc, dddd, eeeee', 'ffffff']; 6console.log(array2str(array)); // [a, bb, ccc, dddd, eeeee, ffffff] 7console.log(JSON.stringify(array)); // ["a, bb, ccc, dddd, eeeee","ffffff"]

Re: garchomp さん

投稿2017/05/01 06:59

編集2017/05/01 07:38
think49

総合スコア18196

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

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

garchomp

2017/05/01 07:14

なるほど。変換するというのも大事なんですね・・・ありがとうございます!
guest

0

皆さんはどのようにコードを書くでしょうか?

javascript

1function sort(array){ 2 return array.sort( (a,b)=> b.length - a.length ); 3}

関数の中に関数が入っているという解釈でよろしいのでしょうか?

だいたいそんな理解であってますが、「高階関数」という言葉を覚えておくといいかと思います。

高階関数(こうかいかんすう、英: higher-order function)とは、関数(手続き)を引数にしたり、あるいは関数(手続き)を戻り値とするような関数のことである。
高階関数 - Wikipedia

   

引数

compareFunction
ソート順を定義する関数を指定します。省略された場合、配列は各要素の文字列比較に基づき辞書順にソートされます。
Array.prototype.sort() - JavaScript | MDN

投稿2017/05/01 07:05

編集2017/05/01 07:08
Lhankor_Mhy

総合スコア37634

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

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

garchomp

2017/05/01 07:15

高階関数ですね。覚えておきます!
guest

0

関数の中に関数が入っているという解釈

はい。そのとおりです。

クローシャというものと関係しているのでしょうか?

あります。Closure クロージャですね。
Javascript の無名関数はクロージャそのものです。

投稿2017/05/01 06:52

TakeoAsai

総合スコア880

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

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

garchomp

2017/05/01 07:14

そうなんですね!ありがとうございます.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.29%

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

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

質問する

関連した質問