JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

JavaScriptで「年-月」形式の文字列配列を古い順にソートする方法

問題の概要

「2009-feb」「2010-jan」のように、年と月をハイフン(-)で連結した文字列が格納された配列があると仮定します。

const arr = ["2009-feb", "2009-jan", "2010-mar", "2010-jan", "2011-jul",
"2011-sep", "2011-jan", "2012-jan", "2012-dec", "2012-feb", "2013-may",
"2013-jul", "2013-jun", "2014-jan", "2014-dec", "2014-may", "2015-may",
"2015-jan", "2015-jun", "2016-jan", "2016-dec"];

ここでは、このような配列を受け取り、要素を古い日付から新しい日付の順(昇順)に並べ替えるJavaScript関数を作成します。

解決のアプローチ

この形式の文字列は、そのまま sort() にかけると辞書順になるため正しく並びません(例:feb が jan より先に来てしまう)。そこで、次の手順で処理します。

  • 各文字列をハイフン(-)で分割し、「年」と「月」に分けます。
  • 月名(jan〜dec)を 1〜12 の数値に対応させるマップを用意します。
  • Array.prototype.sort() の比較関数内で、まず年を比較し、年が同じ場合は月の数値を比較します。

サンプルコード

const sorter = (a, b) => {
    const getDate = date => {
        let day = date.split('-');
        day[1] = {
            jan: 1, feb: 2, mar: 3, apr: 4, may: 5, jun: 6, jul: 7, aug: 8, sep: 9, oct: 10, nov: 11, dec: 12
        }
        [day[1]
        .substring(0, 3)
        .toLowerCase()] || 0;
        return day;
    }
    const aDate = getDate(a);
    const bDate = getDate(b);
    return aDate[0] - bDate[0] || aDate[1] - bDate[1];
}
arr.sort(sorter);
console.log(arr);

コードの解説

  • getDate 関数は、文字列を split('-') で分割したうえで、月名部分を先頭3文字・小文字に正規化し、マップを使って数値に変換します。結果として [年, 月] の配列を返します。
  • 比較式 aDate[0] - bDate[0] || aDate[1] - bDate[1] では、まず年の差を計算します。|| 演算子の性質上、年の差が 0(同じ年)の場合だけ後続の月の比較が行われるため、簡潔に優先順位付きソートが実現できます。

出力結果

コンソールには次のように、年・月ともに昇順へ並べ替えられた配列が出力されます。

[
    '2009-jan', '2009-feb',
    '2010-jan', '2010-mar',
    '2011-jan', '2011-jul',
    '2011-sep', '2012-jan',
    '2012-feb', '2012-dec',
    '2013-may', '2013-jun',
    '2013-jul', '2014-jan',
    '2014-may', '2014-dec',
    '2015-jan', '2015-may',
    '2015-jun', '2016-jan',
    '2016-dec'
]
  1. JavaScriptの配列を数値は昇順、文字列はアルファベット順に並べ替える方法

    問題数値と文字列が混在した配列を受け取り、数値を昇順に並べ替えた要素を先頭に、続けて文字列をアルファベット順に並べ替えた要素を配置した、単一の配列を返すJavaScript関数を作成します。重要な条件として、各要素は元のデータ型(数値・文字列)を維持したまま扱う必要があります。つまり、数値を文字列に変換したり、その逆を行ったりしてはいけません。入力例[5, 8, car, dad, amber, 1, 12, 76, bat]実装コード以下が実際のコードです。 { if(typeof a === number && typeof b === string){

  2. JavaScriptで文字列の二次元配列をソートして対角要素を見つける方法

    本記事では、文字列の配列を扱うJavaScriptのアルゴリズム問題を解説します。「配列をアルファベット順にソートした後、対角線上の文字を抽出する」というシンプルながら応用範囲の広いテクニックを、サンプルコードとともにわかりやすく紹介します。 問題 n個の文字列を要素として持つ配列を受け取るJavaScript関数を作成します。ここで、配列内の各文字列はすべてちょうどn文字で構成されているものとします。つまり、この配列はn×nの正方行列として扱うことができます。 関数には以下の2つの処理が求められます。 まず、配列をアルファベット順(辞書順)にソートすること 次に、ソート後の配列を行列とみな