JavaScriptで別の配列をもとに月の範囲を配列から取得する方法
ここでは、次のような文字列の配列が2つあると仮定します。1つ目の配列には、1年12か月それぞれに対応する文字列が格納されています。
const year = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'];
2つ目の配列は、月の範囲を表す2つの文字列で構成されています。
const monthsRange = ['aug', 'oct'];
今回の課題は、このような2つの配列を受け取るJavaScript関数を実装することです。関数は、2つ目の配列で指定された範囲に該当する月を、1つ目の配列からすべて抽出して返す必要があります。
上記の配列の場合、期待される出力は以下のとおりです。
const output = ['aug', 'sep'];
出力には範囲の終端である「oct」が含まれていない点に注意してください。これは意図的な仕様であり、この関数は開始月を含み、終了月を含まない範囲を返します。
実装例
const year = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'];
const range = ['aug', 'dec'];
const getMonthsInRange = (year, range) => {
const start = year.indexOf(range[0]);
const end = year.indexOf(range[1] || range[0]);
// 範囲が逆順でも動作する
if (start <= end) {
return year.slice(start, end);
} else {
// 年をまたぐ範囲(例:「nov」〜「feb」)にも対応
return year.slice(start).concat(year.slice(0, end));
}
};
console.log(getMonthsInRange(year, range));
出力
コンソールには次のように出力されます。
[ 'aug', 'sep', 'oct', 'nov' ]
コードのポイント
- indexOf():指定した要素が配列内で最初に出現するインデックスを返します。ここでは、開始月と終了月それぞれの位置を取得するために使用しています。
- slice(start, end):開始インデックスから終了インデックスの直前までの要素を、新しい配列として切り出します。終了位置自体は含まれないため、「終端月を除外する」という仕様と自然に一致します。
- 年をまたぐ範囲への対応:start が end より大きい場合(例:「nov」〜「feb」など)、
year.slice(start)で年末側の要素を取得し、year.slice(0, end)で年始側の要素を連結することで、正しく範囲を抽出できます。
-
【初心者向け】JavaScriptのArray.from()メソッドの使い方を実例で解説
JavaScript の Array.from() メソッドは、length プロパティを持つオブジェクト(配列風オブジェクト)や、文字列・Map・Set などの反復可能(イテラブル)なオブジェクトから、新しい Array オブジェクトを生成して返すためのメソッドです。元のオブジェクトは変更されず、常に新しい配列インスタンスが返されます。 基本構文 Array.from(obj, mapFunction, val) パラメータの説明 obj:配列へ変換したい対象のオブジェクト。配列風オブジェクト(length プロパティを持つもの)や反復可能なオブジェクトを指定します。 mapFunctio
-
JavaScriptのArray.from()メソッドとは?使い方と実例をわかりやすく解説
Array.from()メソッドは、配列風オブジェクト(array-like)や反復可能オブジェクト(iterable)から、新しい配列オブジェクトを作成するための便利なメソッドです。文字列、Map、Set、NodeListなど、さまざまなデータを手軽に配列へ変換できます。 Array.from()の基本的な動作 例えば、文字列「HelloWorld」に対してArray.from()を使用すると、1文字ずつ分割された新しい配列が生成されます。以下に実際のコード例を示します。 サンプルコード <!DOCTYPE html> <html lang="ja"&g