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' ]
-
JavaScriptの配列を数値は昇順、文字列はアルファベット順に並べ替える方法
問題数値と文字列が混在した配列を受け取り、数値を昇順に並べ替えた要素を先頭に、続けて文字列をアルファベット順に並べ替えた要素を配置した、単一の配列を返すJavaScript関数を作成します。重要な条件として、各要素は元のデータ型(数値・文字列)を維持したまま扱う必要があります。つまり、数値を文字列に変換したり、その逆を行ったりしてはいけません。入力例[5, 8, car, dad, amber, 1, 12, 76, bat]実装コード以下が実際のコードです。 { if(typeof a === number && typeof b === string){
-
JavaScriptで文字列の二次元配列をソートして対角要素を見つける方法
本記事では、文字列の配列を扱うJavaScriptのアルゴリズム問題を解説します。「配列をアルファベット順にソートした後、対角線上の文字を抽出する」というシンプルながら応用範囲の広いテクニックを、サンプルコードとともにわかりやすく紹介します。 問題 n個の文字列を要素として持つ配列を受け取るJavaScript関数を作成します。ここで、配列内の各文字列はすべてちょうどn文字で構成されているものとします。つまり、この配列はn×nの正方行列として扱うことができます。 関数には以下の2つの処理が求められます。 まず、配列をアルファベット順(辞書順)にソートすること 次に、ソート後の配列を行列とみな