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

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

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

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

Q&A

解決済

2回答

1717閲覧

jsのビルドインオブジェクトを勉強しているのですがsort関数が理解できません

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

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

0グッド

0クリップ

投稿2014/12/09 12:34

lang

1var ary1 = new Array('bb','eeee','aaa','dddd','cc'); 2 3//独自のルールでソートする 4 5var sortFunc = function(a,b) { 6return a.length - b.length; 7}; 8var result1 = ary1.sort(sortFunc); 9document.write('長さ順'+ result1 + '<br>');

これのa.length - b.lengthという部分がなにをしているのか理解できません
sortFuncという名前の変数に代入されている無名関数の引数にaとbを指定してaとbの長さ?を計算してreturnでその結果を外に出している?のでしょうか...

これの結果が 長さ順: bb,cc,aaa,dddd,eeeeになります

a.length - b.lengthで何故この結果になるのか教えていただけませんか?

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

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

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

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

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

guest

回答2

0

sort関数は配列から2つの要素を取り出し、比較しその結果が正か負かで判断しています。
戻り値が……
負:第一引数が前に
0:入れ替えなし
正:第一引数が後ろに

よって

sortFuncという名前の変数に代入されている無名関数の引数にaとbを指定してaとbの長さ?を計算してreturnでその結果を外に出している?のでしょうか...

という考えは正解です。

lang

1var ary1 = new Array('bb','eeee','aaa','dddd','cc'); 2var sortFunc = function(a,b) { 3 console.log(a+" : "+b+" → "+( a.length - b.length)); 4 return a.length - b.length; 5}; 6var result1 = ary1.sort(sortFunc); 7console.log(result1 );

これをFirefoxなどのブラウザに用意されているデベロッパツールを使ってログを追って見てください

lang

1Array [ "bb", "eeee", "aaa", "dddd", "cc" ]//初期 2 3"bb : eeee → -2" 4"eeee : aaa → 1" 5"bb : aaa → -1" 6"dddd : cc → 2" 7"eeee : cc → 2" 8"bb : cc → 0" 9"aaa : cc → 1" 10"aaa : dddd → -1" 11"eeee : dddd → 0" 12Array [ "bb", "cc", "aaa", "eeee", "dddd" ]//結果

先頭から比較が始まり、入れ替えが起こった時に前の要素と比較します。

……補足 sort関数はオブジェクトそのものを書き換えます。

投稿2014/12/09 14:12

Ryo

総合スコア507

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

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

0

ベストアンサー

lengthプロパティは要素の数を持っています。

lang

1["AAA","10",1].length//3

sort関数は引数に比較関数を渡せます。
比較関数を渡さなかった場合、アルファベットなどを辞書順に並び替えます。

lang

1["A1000","A100","B000","0AAA","1000","1"].sort() 2//["0AAA", "1", "1000", "A1000", "A109", "B000"]; 3/* 4 0-9 5 a-z 6*/

数字での昇順、降順ソートなら以下のように比較関数を作成し実装できます

lang

1function ascendingOrder (_a,_z){ 2 return _a-_z; 3} 4function descendingOrder (_a,_z){ 5 return _z-_a; 6} 7 8//昇順ソート 9["1000","100","000","0.1","500","1"].sort(ascendingOrder) 10//["000", "0.1", "1", "100", "500", "1000"] 11 12//降順ソート 13["1000","100","000","0.1","500","1"].sort(descendingOrder) 14// ["1000", "500", "100", "1", "0.1", "000"]

今回の場合はaとbの要素数length(配列の長さと言う人もいるかもしれません)を比較して昇順ソートしているので結果として要素の少ない順に並んでいます。
(更に言えば同数のものはアルファベット順でソートされていますね)

投稿2014/12/12 06:08

Cf_cwd

総合スコア730

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

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

退会済みユーザー

退会済みユーザー

2014/12/12 14:25

わかりやすい説明で納得できました! これからも質問することがありますが是非宜しくお願いします
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問