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

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

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

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

Q&A

解決済

9回答

364閲覧

文字型配列のソーティング

Yasu0421

総合スコア37

JavaScript

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

0グッド

1クリップ

投稿2018/07/04 07:17

以下の様な、第1要素を"年"とし、第2要素以降を3文字の英字で示した月の羅列がある配列があるとします。

Javascript

1["2018", "Jan", "Mar", "May", "Jul", "Aug", "Oct", "Dec", "Feb", "Jun", "Sep", "Apr", "Nov"]

これをできるだけ簡単な方法で以下のように月順にソートする方法はないでしょうか?

Javascript

1["2018", "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]

ご教示いただければ幸いです。

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

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

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

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

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

guest

回答9

0

ベストアンサー

JavaScript

1const month = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; 2var data = ["2018", "Jan", "Mar", "May", "Jul", "Aug", "Oct", "Dec", "Feb", "Jun", "Sep", "Apr", "Nov"]; 3var s = data.slice(1, data.length); 4s.sort((a, b) => month.indexOf(a) - month.indexOf(b)); 5console.log([data[0], ...s]);

投稿2018/07/04 07:34

x_x

総合スコア13749

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

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

Yasu0421

2018/07/04 07:47

ご回答いただきありがとうございます。 助かります。 これで、実現できそうす。お知恵いただき、ありがとうございました。
guest

0

手抜き

js

1const data = ["2018", "Jan", "Mar", "May", "Jul", "Aug", "Oct", "Dec", "Feb", "Jun", "Sep", "Apr", "Nov"]; 2const result = data.sort((a, b) => isNaN(a) ? Date.parse(`1 ${a} 2000`) - Date.parse(`1 ${b} 2000`) : -1);

投稿2018/07/04 07:51

編集2018/07/04 07:55
turbgraphics200

総合スコア4267

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

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

og24715

2018/07/04 08:57

Date.parse() 、そういうのもあるのか…。Date.parse(`1 ${month}`) でも期待通りの動きをするみたいです
Yasu0421

2018/07/05 00:07

ご回答いただきありがとうございます。 たったの1行で所期を満足できていました。 ここまでのスキルを身に着けたいものです。 今回、様々な解決手段をいただき、非常に勉強になりました。 有難うございました。
turbgraphics200

2018/07/05 10:23

`1 ${month}`だと、Chromeだけ動作し、他のブラウザーだと動作しなかったため、泣く泣く`1 ${month} 2000`としました。
og24715

2018/07/05 10:29

なるほど。そんな罠があるんですね
guest

0

とりあえずこれでも動く。

js

1const test = [ '2018', 'Jan', 'Mar', 'May', 'Jul', 'Aug', 'Oct', 'Dec', 'Feb', 'Jun', 'Sep', 'Apr', 'Nov' ]; 2const res = [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ].reduce( ( pre, curr )=> { 3 if ( test.includes( curr ) ) pre.push( curr ); 4 return pre; 5}, [ test[ 0 ] ] ); 6console.log( res ); 7```**動くサンプル:**[https://jsfiddle.net/vo2dxsy8/](https://jsfiddle.net/vo2dxsy8/)

投稿2018/07/04 07:45

kei344

総合スコア69407

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

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

Yasu0421

2018/07/04 08:04

ご回答いただきありがとうございます。 参考にさせて頂きます。 助かりました。
guest

0

愚直な解法ですがコレなら抜けにも対応できるんじゃないですかね。

js

1const random = ['2018', 'Jan', 'Sep', 'Apr', 'Nov']; 2 3const mNames = new Map([ 4 ['Jan', 1], 5 ['Feb', 2], 6 ['Mar', 3], 7 ['Apr', 4], 8 ['May', 5], 9 ['Jun', 6], 10 ['Jul', 7], 11 ['Aug', 8], 12 ['Sep', 9], 13 ['Oct', 10], 14 ['Nov', 11], 15 ['Dec', 12], 16]); 17 18const sorted = [random[0], ...random.slice(1).sort((a, b) => mNames.get(a) - mNames.get(b))] 19console.log(sorted); // ->  ["2018", "Jan", "Apr", "Sep", "Nov"] 20

投稿2018/07/04 07:37

og24715

総合スコア832

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

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

Yasu0421

2018/07/04 07:54

ご回答ありがとうございます。 分かりやすいご回答いただき、感謝いたします。助かります。 これでもできそうです。 いろいろとお知恵いただき、嬉しく思います。
guest

0

ソート、という言い方だとそもそも [1, ..., 12] という配列でないと処理できないですよね。文字列に正しい順番を与えるとしたら、文字列を数字に変換して並べることになると思います。

別の考え方として、正しい並びがわかっているのであれば、正しい並びの順に対象となる配列に含まれているものだけをピックアップすればいいと思います。

js

1const data = ["2018", "Jan", "Mar", "May", "Jul", "Aug", "Oct", "Dec", "Feb", "Apr", "Nov"] 2 3const master = ["2018", "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] 4 5var result = [] 6for (var i = 0; i < master.length; i++) { 7 if (data.indexOf(master[i]) >= 0) { 8 result.push(master[i]) 9 } 10}

投稿2018/07/04 07:49

mather

総合スコア6753

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

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

Yasu0421

2018/07/04 08:03

ご回答いただきありがとうございます。 そうですね。こお手段で私も考えておりました。 大変助かりました。 以上よろしくお願いいたします。
guest

0

こんにちは。

以下のようなやり方でやってみました。
(※以下のコードと同じものを https://jsfiddle.net/jun68ykt/bp3ujrwv/16/ にも上げました。)

javascript

1const data = ["2018", "Jan", "Mar", "May", "Jul", "Aug", "Oct", "Dec", "Feb", "Jun", "Sep", "Apr", "Nov"]; 2 3const orderedMonths = data.slice(1).sort( 4 (m1, m2) => Date.parse(`${m1} 1,2018`) - Date.parse(`${m2} 1,2018`) 5 ); 6 7const result = data.slice(0,1).concat(orderedMonths); 8 9console.log(result);

上記を実行すると

["2018", "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]

と表示されます。

ちなみに上記のコードでは、、配列 data の2番目以降に "Hoge" のような、
月を表す英語3文字になっていないものが含まれる場合は考慮していません。

以上参考になれば幸いです。


補足

momentを使うと、以下のように、少しコード量を減らせます。

javascript

1const data = ["2018", "Jan", "Mar", "May", "Jul", "Aug", "Oct", "Dec", "Feb", "Jun", "Sep", "Apr", "Nov"]; 2 3const orderedMonths = data.slice(1).sort( 4 (m1, m2) => moment(m1, 'MMM') - moment(m2, 'MMM') 5 ); 6 7const result = data.slice(0,1).concat(orderedMonths); 8 9console.log(result);

https://jsfiddle.net/jun68ykt/bp3ujrwv/25/

投稿2018/07/04 07:49

編集2018/07/04 08:11
jun68ykt

総合スコア9058

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

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

Yasu0421

2018/07/04 08:01

ご回答ありがとうございます。 いろいろなかたから、いろいろな解決手段をいただき、大変参考になります。 参考にさせていただきます。有難うございました。
guest

0

簡単かどうかはわからないけど、愚直にこんな感じ

js

1var master = [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; 2var random = ["2018", "Jan", "Mar", "May", "Feb", "Jun", "Sep", "Apr", "Nov"]; 3 4console.dir(random); 5 6var result = [random[0]]; 7for (v of master) { 8 if (random.indexOf(v) >= 0) { 9 result.push(v); 10 } 11} 12console.dir (result);

投稿2018/07/04 07:45

euledge

総合スコア2404

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

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

Yasu0421

2018/07/05 00:05

ご回答いただきありがとうございます。 マスターを用意し、マスター要素にマッチしたら、 ソート用配列にプッシュですね。 初心者に優しい読みやすい内容だと思います。 有難うございました。
guest

0

絶対に12ヶ月揃っているとわかっているのであれば、その配列とつなぐ、というのがいちばん早いでしょう。どちらにしても、月順ソートという機能は標準ではないので、12ヶ月分のマスターは必要となります。

javascript

1var ordered = [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; 2 3var random = ["2018", "Jan", "Mar", "May", "Jul", "Aug", "Oct", "Dec", "Feb", "Jun", "Sep", "Apr", "Nov"]; 4 5var result = [random[0]].concat(ordered);

投稿2018/07/04 07:22

maisumakun

総合スコア145183

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

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

Yasu0421

2018/07/04 07:30

いつもありがとうございます。 質問の定義が不足していたようで、すみません ・配列に含まれる月数は、ランダムで且つ、"Apr"の次が、"Aug"など月が飛んでいる場合もあるのです。
guest

0

月が12個あって重複がないなら、ソートするなんて思わなければいいでしょう。
年に12個新規で月を付加していってください

javascript

1var a=["2018"]; 2[].push.apply(a,["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]); 3console.log(a);

投稿2018/07/04 07:22

yambejp

総合スコア114829

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問