以下の様な、第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ページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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
総合スコア13749
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総合スコア4267
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/07/05 00:07
2018/07/05 10:23
2018/07/05 10:29
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
総合スコア69407
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
総合スコア832
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
総合スコア6753
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);
投稿2018/07/04 07:49
編集2018/07/04 08:11総合スコア9058
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
総合スコア2404
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
総合スコア145183
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/07/04 07:47