Help us understand the problem. What is going on with this article?

Javascript 文字列を降順にしたい sortを使うが思い通りにならない。

降順にしたいデータ

data = ["20[WW]", "25[DDAA]", "19[CCC]", "24[BB]", "18[AA]"]

欲しい結果

=> ["25[DDAA]", "24[BB]", "20[WW]", "19[CCC]", "18[AA]"]

まずは昇順

data = ["20[WW]", "25[DDAA]", "19[CCC]", "24[BB]", "18[AA]"]
data.sort()
=>["18[AA]", "19[CCC]", "20[WW]", "24[BB]", "25[DDAA]"]

思った通りの動作でいい感じです。

次に降順

data = ["20[WW]", "25[DDAA]", "19[CCC]", "24[BB]", "18[AA]"]
data.sort(function(a,b){return(b-a);})
=>["20[WW]", "25[DDAA]", "19[CCC]", "24[BB]", "18[AA]"]

どう見てもこれじゃない感

方法1

data = ["20[WW]", "25[DDAA]", "19[CCC]", "24[BB]", "18[AA]"]
data.sort((a, b) => a.toLowerCase() < b.toLowerCase() ? 1 : -1)
=>["25[DDAA]", "24[BB]", "20[WW]", "19[CCC]", "18[AA]"]

期待通りです。全部小文字に変換してから三項演算子で比較してます。

方法2

data = ["20[WW]", "25[DDAA]", "19[CCC]", "24[BB]", "18[AA]"]
data.sort().reverse()
=>["25[DDAA]", "24[BB]", "20[WW]", "19[CCC]", "18[AA]"]

期待通りです。昇順が問題なく動作するならその配列をリバースすれば降順になる。

方法3(推奨)

data = ["20[WW]", "25[DDAA]", "19[CCC]", "24[BB]", "18[AA]"]
data.sort((a, b) => parseFloat(b) - parseFloat(a));

@il9437 さんよりコメント欄で教えていただきました。感謝です。
整数部の桁数や正負が混在していてもしっかり動作するので一番良い方法かと思います。
※paraseFloatは最初が文字列から始まる場合はうまく動作しません。

parseFloat('100[AABB]')
=> 100
parseFloat('-30example')
=> -30
parseFloat('0544test')
=> 544
parseFloat('aaaa1005')
=> NAN

感想

降順が思い通り動作しなくて少しハマりました。

スピード的には方法1と方法2はどっちの方が早いんでしょうか
あまり速度が変わらないor方法2の方が早いなら方法2の方がスッキリしてる気がするのでいいと思いますがもしご存知の方いらっしゃいましたらコメント欄等で教えていただけますと幸いです。(@netebakari さんより参考になるコメントいただいておりますのでぜひ参照くださいませ)

steaveHikaru
WEB系企業に最近入社 それまでは趣味で勝手に会社で使うwebアプリを開発してました。 ■使用したことがあるスキル Ruby(Ruby on Rails),PHP,Javascript(JQuery,Vue.js),VBA,Python,AWS(EC2,S3,Route53),CentOS7,Apache,Nginx,Docker,DB(MS SQL,MySQL,PostgreSQL)
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away