JavaScriptで生年月日から星座を判定する方法
この記事では、Dateオブジェクトを受け取り、その日付に対応する12星座を返すJavaScript関数の実装方法を解説します。誕生日から星座を自動的に判定したい場合に役立つ、シンプルで実用的なテクニックです。
問題
日付オブジェクトを引数として受け取るJavaScript関数を作成します。関数は、受け取った日付(誕生日)に該当する星座を返す必要があります。
コード例
以下が実際のコードです。
const date = new Date();
// 2021年4月2日に実行した場合の例
const findSign = (date) => {
// 各月の星座が切り替わる「境界日」
const days = [21, 20, 21, 21, 22, 22, 23, 24, 24, 24, 23, 22];
// 1月後半から順に並べた星座名
const signs = ["水瓶座", "魚座", "牡羊座", "牡牛座", "双子座", "蟹座",
"獅子座", "乙女座", "天秤座", "蠍座", "射手座", "山羊座"];
let month = date.getMonth(); // 月は0始まり(0=1月)
let day = date.getDate();
if (month == 0 && day <= 20) {
month = 11; // 1月1日〜20日は前年の山羊座
} else if (day < days[month]) {
month--; // 境界日前なら前の月の星座
}
return signs[month];
};
console.log(findSign(date));
出力
牡羊座
現在の日付を使っているため、関数を実行するタイミングによって出力結果は変わります。
仕組みの解説
この関数のポイントは次の通りです。
- 配列days:各月で星座が切り替わる日付(境界日)を格納しています。例えばインデックス0(1月)の値は21なので、1月21日以降は水瓶座になります。
- 配列signs:1月下旬の水瓶座から始めて、魚座・牡羊座…と続く順序で星座名を並べています。「月の前半は前の星座」というルールに配列のインデックスを対応させるためです。
- getMonth()の特性:JavaScriptの
getMonth()は0始まり(0=1月、11=12月)ですが、これにより配列のインデックスとそのまま対応できて便利です。 - 1月の特別処理:1月1日〜20日は前年の山羊座にあたるため、月のインデックスを11(山羊座)に書き換えています。
特定の誕生日で試すには
現在日時ではなく特定の誕生日で確認したい場合は、次のようにDateオブジェクトを生成してください。
// 1995年8月15日の場合(月は0始まりなので7を指定) const birthday = new Date(1995, 7, 15); console.log(findSign(birthday)); // 獅子座
星座と判定期間の一覧
本コードにおける各星座の判定期間は以下の通りです。
| 星座 | 期間 |
|---|---|
| 山羊座 | 12月22日〜1月20日 |
| 水瓶座 | 1月21日〜2月19日 |
| 魚座 | 2月20日〜3月20日 |
| 牡羊座 | 3月21日〜4月20日 |
| 牡牛座 | 4月21日〜5月21日 |
| 双子座 | 5月22日〜6月21日 |
| 蟹座 | 6月22日〜7月22日 |
| 獅子座 | 7月23日〜8月23日 |
| 乙女座 | 8月24日〜9月23日 |
| 天秤座 | 9月24日〜10月23日 |
| 蠍座 | 10月24日〜11月22日 |
| 射手座 | 11月23日〜12月21日 |
このように、境界日の配列とシンプルな条件分岐だけで星座判定を実装できます。占いコンテンツやフォームの自動補完など、さまざまな場面で応用してみてください。
-
JavaScriptでバイナリ文字列を単調増加にするための最小反転回数を求める方法
単調増加文字列とは0と1のみで構成される文字列が「単調増加」とみなされるのは、任意の個数(0個でも可)の0が先頭に並び、その後に任意の個数(これも0個でも可)の1が続く場合です。つまり、「000111」「0011」「1」などは単調増加ですが、「1100」「010」などは該当しません。問題の概要本記事では、バイナリ文字列 str を唯一の引数として受け取るJavaScript関数を作成します。文字列内の任意の0を1へ、または任意の1を0へと反転(フリップ)することができます。このとき、文字列全体を単調増加にするために必要な最小の反転回数を求めて返すのが目標です。入力例const str = 00
-
JavaScriptで配列内の最長フィボナッチ部分列を見つける方法
フィボナッチ数列とは 数列 X_1, X_2, ..., X_n がフィボナッチ数列であるとは、以下の条件を満たすことを指します。 n >= 3 である すべての i + 2 <= n に対して、X_i + X_{i+1} = X_{i+2} が成り立つ つまり、隣り合う2項の和が常に次の項になる数列のことです。 問題の概要 数値の配列 arr を第1引数(唯一の引数)として受け取り、配列 arr 内に存在する最長のフィボナッチ部分列の長さを見つけて返すJavaScript関数を作成する必要があります。 ここでいう「部分列」とは、元の配列 arr から任意の個数の要素(0個で