JavaScirpt 配列 ソート
やりたいこと
ひとことで言うと
配列のソート処理
複数行で言うと
以下のような配列の各要素をソートしたい
const values = [30, 20, 10]
例えば結果が以下のようになるようにする
[10, 20, 30]
ソートの仕方
これも野暮ったいやり方に、スマートなやり方、当然いくつかありますね。
野暮ったいやり方としては、こちらのループ処理でやっても良いでしょう。配列の要素の出し入れみたいなのを使うことになりそうです。
ここでは、sort()を使います。
sort()
const values = [30, 20, 10] console.log(values.sort())
簡単ですね。これでやりたいことの結果が得られます。
[ 10, 20, 30 ]
あれ?反対は出来ないの?
sort() その2
sort()にとっては、『反対に並べる=思ったように並べる』です。 sort()は引数にコールバック関数を取ります。
function compare( a, b ){ return a < b } const values = [30, 20, 10] console.log(values.sort(compare))
とすれば反対に並びます。(といっても、この場合並びが変わらないので、元のデータを逆さまにして試してください)
不等号を逆にすると、コールバック関数を指定しなかった時と同じ動作になります。 ですが、本来はこんないい加減なのでは無くて、-1, 0, 1を返す礼儀正しい?関数を書く方が良いと思います。
補足
「そういうものだということ」と「数字以外」
そういうもの
配列のソートは、それ自体がソートされてしまいます。
const values = [30, 20, 10] const results = values.sort() console.log(values) console.log(results)
とすると、以下のようになります。
[ 10, 20, 30 ] [ 10, 20, 30 ]
もしvaluesが無傷だと期待していた方がいたとしたら、resultsがtrueとか'success'とかならないだけ良かったと思うほかありません。(ま、そんなの返ってきたら別の意味で使いにくくて仕方ないとは思いますが)
従って分かりやすさのために書くのはアリかも知れませんが、元の変数が保たれているという誤解の元にもなりそうです。sort()した結果を別の変数に入れる人は少ないかも知れませんが、元の並びを保つために事前に別の変数にコピーする人はいると思います。
同じ感覚で操作していても、元の変数が変化するものと、元は無影響なものがあるので、すこし注意する必要があります。(使用人は、細やかな気遣いを必要とします)
数字以外
例えば文字列でもソートは可能です。
といっても、比較するのはコールバック関数の役割で、sort()さんは-1,0,1に従って作業しているだけです。
比較するロジックは、概ね『文字列の比較』が関心事の中心だと思いますので、そちらで。
何を言っているかというと、文字列の長さ順で並べるならa.lenghtとかってやればいいわけですね。文字列でソートというと、きっとあいうえお順的なことを想像したと思います。それは文字列の比較で、a>bと出来ちゃいますが、その結果を知っておく必要があり、それは『文字列の比較』へということです。