最近、ちょっといろいろあってJSを書く必要が生じたのです。
JSというかjQueryはずっと触ってきているので何とかなるのかなと思っていたのだけれども・・・やはり罠があった!
諸々の仕様というか制限で、DBからレコードを取得する際にソート指定はNG!?
「ふざけんな!何のためのDBなんだよ!?設計したの誰?バカなの?」とひとしきり文句を言う事30分、当然誰も話を聞いてくれず30分を無駄にしてしまった。
つーことで、それなら1,000,000歩譲ってJSでソートしようかなとしたところ、「何これ???」とトホホな結果が・・・。
超簡単に書くと、↓の感じ。
const data = [1,23,5,40,10]
data.sort()
結果:1, 10, 23, 40, 5
希望通り「1,5,10,23,40」って並びになってくれていない?!
ちょっとググってみたら、どうやらsort()はそのまま実行すると配列要素を文字列って解釈するらしい。なんだよそれ?暗黙に型変換して数値で昇順にソートしろよ!って怒っても仕方なく、それならば解法を見つけねばということで・・・見つけた。
優しい解説で、とてもいいサイトです。
https://dezanari.com/js-sort/
sort(CALLBACK_FUNCTION)というようにして、CALLBACK_FUNCTIONは引数を2つ取る比較関数ということで問題解決!!!
sort((a, b) =>{
if(a < b){
return -1;
} if(a > b){
return 1;
}
});
return 1 とか -1 とか「何のこっちゃ?」って感じだけれども、
- コールバック関数が0未満(例えば-1)を返した場合:
a
はb
の前に来る(順番は変わらない) - コールバック関数が0より大きい値(例えば1)を返した場合:
a
はb
の後ろに来る(順番が変わる) - コールバック関数が0を返した場合:何もしない
ということです。
なので、数値として比較して昇順にソートしたければ
- aがbより小さければ-1 ===> aはそのまま
- aがbより大きければ1 ===> aはbの後ろに移動
これが繰り返されて、見事希望通り「1,5,10,23,40」って並びになってくれる!そして、これをひっくり返せば降順になるわけだ。
いや〜、勉強になりました。ありがとうhttps://dezanari.com/js-sort/の人!
つーか、そもそもこのアプリでソート使っちゃダメとかのクソ設計したヤツは一生許すまじ。