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

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

ただいまの
回答率

90.49%

  • JavaScript

    16461questions

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

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

解決済

回答 9

投稿

  • 評価
  • クリップ 0
  • VIEW 280

Yasu0421

score 5

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

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


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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    2018/07/09 06:56

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

回答 9

checkベストアンサー

+3

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/04 16:47

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

    キャンセル

+2

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

const random = ['2018', 'Jan', 'Sep', 'Apr', 'Nov'];

const mNames = new Map([
  ['Jan', 1],
  ['Feb', 2],
  ['Mar', 3],
  ['Apr', 4],
  ['May', 5],
  ['Jun', 6],
  ['Jul', 7],
  ['Aug', 8],
  ['Sep', 9],
  ['Oct', 10],
  ['Nov', 11],
  ['Dec', 12],
]);

const sorted = [random[0], ...random.slice(1).sort((a, b) => mNames.get(a) - mNames.get(b))]
console.log(sorted); // ->  ["2018", "Jan", "Apr", "Sep", "Nov"]

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/04 16:54

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

    キャンセル

+2

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

const test = [ '2018', 'Jan', 'Mar', 'May', 'Jul', 'Aug', 'Oct', 'Dec', 'Feb', 'Jun', 'Sep', 'Apr', 'Nov' ];
const res = [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ].reduce( ( pre, curr )=> {
    if ( test.includes( curr ) ) pre.push( curr );
    return pre;
}, [ test[ 0 ] ] );
console.log( res );

動くサンプル:https://jsfiddle.net/vo2dxsy8/

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/04 17:04

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

    キャンセル

+2

手抜き

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/04 17:57

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

    キャンセル

  • 2018/07/05 09:07

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

    キャンセル

  • 2018/07/05 19:23

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

    キャンセル

  • 2018/07/05 19:29

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

    キャンセル

+1

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

var ordered = [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];

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

var result = [random[0]].concat(ordered);

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/04 16:30

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

    キャンセル

+1

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

var master = [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
var random = ["2018", "Jan", "Mar", "May",  "Feb", "Jun", "Sep", "Apr", "Nov"];

console.dir(random);

var result = [random[0]];
for (v of master) {
    if (random.indexOf(v) >= 0) {
    result.push(v);
    }
}
console.dir (result);

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/05 09:05

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

    キャンセル

+1

こんにちは。

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

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

const orderedMonths = data.slice(1).sort(
    (m1, m2) => Date.parse(`${m1} 1,2018`) - Date.parse(`${m2} 1,2018`)
 );

const result = data.slice(0,1).concat(orderedMonths);

console.log(result);


上記を実行すると

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

と表示されます。

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

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


補足

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

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

const orderedMonths = data.slice(1).sort(
    (m1, m2) => moment(m1, 'MMM') - moment(m2, 'MMM')
 );

const result = data.slice(0,1).concat(orderedMonths);

console.log(result); 


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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/04 17:01

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

    キャンセル

+1

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

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

const data = ["2018", "Jan", "Mar", "May", "Jul", "Aug", "Oct", "Dec", "Feb", "Apr", "Nov"]

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

var result = []
for (var i = 0; i < master.length; i++) {
  if (data.indexOf(master[i]) >= 0) {
    result.push(master[i])
  }
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/04 17:03

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

    キャンセル

-1

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 受付中

    多数のSSL証明書の期限の管理方法について

    ホスティング業者なら皆さん悩まれる所だと思いますが、多数のhttpsサイトを運用しており、当然サイト毎に証明書を作ってサーバに配置しているのですが、これが10個20個ならともかく、

  • 受付中

    サイトに日本時間を表示する方法

    こんにちは、いつもお世話になります。 世界中の閲覧者がどこから見ても、日本時間が分かる(つまりサイトに表示される) にはどうしたら良いでしょうか? サイトのヘッダーの上に女の子

  • 解決済

    "Thu Jun 01 14:22:55 JST 2015"をJavaScriptでパースする

    サーバーサイドの人から、APIで戻ってくる値が"Thu Jun 01 14:22:55 JST 2015"という形式と言われました。JSでnew Date()に渡してもパースできま

  • 解決済

    jsを使ってoptionの中身を少しだけ変更したい

    jsを使って ・getYearメソッドでは、表示用の年という文字を取り除きたい。 ・getDayメソッドでは、表示用の日という文字を取り除きたい。 ・getMonthでは、1

  • 解決済

    for文で、valueと表示用に、別々の値をセットしたい

    下記の記述をどうにか組み合わせて <option value="数字">英語表記</option> にしたいのですが、どうすればよいでしょうか? 発想が間違ってる可能性も

  • 解決済

    pythonにおける時刻のソート

    単純な質問です。 python3において、時刻のデータが以下のように与えられたとき古い順に並べなおすような操作はどのようなコード、または関数を用意すればできるのか教えてくださ

  • 解決済

    Railsでの条件分岐の記述について教えてください。

    Rails5.1.3でWebアプリケーション制作の勉強中です。条件分岐の記述について教えてください。 やりたいことは 数段階に分けて条件分岐し途中で条件がtrueになったら抜けるみ

  • 解決済

    javascriptで時計を表示したい

    週刊アスキーに掲載されていたJavascriptで時計を表示するのをさいげんしているのですが、うまく表示されません。どこか間違っていると思うのですが、javascriptに触れてい

同じタグがついた質問を見る

  • JavaScript

    16461questions

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