日数を年・月・週・日に変換するJavaScript関数の作り方
本記事では、日数を表す数値を受け取り、その日数を「年」「月」「週」「日」に分解した結果をオブジェクトとして返すJavaScript関数の作成方法を解説します。
要件
関数は、次の4つのプロパティを持つオブジェクトを返す必要があります。
years(年)、months(月)、weeks(週)、days(日)
各プロパティには、入力された日数から計算できる適切な値を格納します。なお、この計算ではうるう年を考慮せず、1年を365日として扱います。
例
たとえば、入力が 738 の場合、出力は次のようになります。
const output = {
years: 2,
months: 0,
weeks: 1,
days: 1
}コード例
それでは、この関数のコードを見ていきましょう。
const days = 738;
const calculateTimimg = d => {
let months = 0, years = 0, days = 0, weeks = 0;
while(d){
if(d >= 365){
years++;
d -= 365;
}else if(d >= 30){
months++;
d -= 30;
}else if(d >= 7){
weeks++;
d -= 7;
}else{
days++;
d--;
}
};
return {
years, months, weeks, days
};
};
console.log(calculateTimimg(days));処理の流れ
この関数は、whileループを使って残りの日数を順番に減らしていきます。具体的には以下のロジックです。
- 残りが365日以上なら「年」を1つ増やし、365を引く
- 残りが30日以上なら「月」を1つ増やし、30を引く
- 残りが7日以上なら「週」を1つ増やし、7を引く
- それ以外なら「日」を1つ増やし、1を引く
この処理を日数が0になるまで繰り返すことで、大きな単位から順に変換することができます。
より効率的な実装方法
上記のコードは理解しやすい反面、1日ずつループを回すため処理が非効率です。Math.floor()と剰余演算子(%)を組み合わせると、ループなしで同じ結果を得られます。
const calculateTiming = d => {
const years = Math.floor(d / 365);
d %= 365;
const months = Math.floor(d / 30);
d %= 30;
const weeks = Math.floor(d / 7);
const days = d % 7;
return { years, months, weeks, days };
};
console.log(calculateTiming(738));出力結果
いずれの実装でも、コンソールには次のように表示されます。
{ years: 2, months: 0, weeks: 1, days: 1 }
-
JavaScriptで配列をSet(セット)に変換する方法
JavaScriptで配列をSetに変換するときの基本JavaScriptでは、Setオブジェクトを使うことで、配列から重複しない一意の値だけを持つコレクションを簡単に作成できます。SetはES6(ECMAScript 2015)で導入された組み込みオブジェクトで、同じ値が複数回追加されても自動的に1つにまとめられるのが特徴です。変換自体は非常にシンプルで、new Set(配列)と書くだけで完了します。コード例:配列からSetへの変換以下は、重複を含む配列をSetに変換して画面に表示するサンプルコードです。<!DOCTYPE html> <html lang=ja> &
-
【初心者向け】JavaScriptのFileとFileReaderを使ってファイルを読み込む方法
JavaScriptにおけるFileとFileReaderとは? JavaScriptでは、<input type=file>要素を使うことで、ユーザーにローカルファイルを選択させることができます。選択されたファイルはFileオブジェクトとして取得でき、ファイル名・サイズ・MIMEタイプなどの基本情報へアクセス可能です。 さらに、FileReaderオブジェクトを利用すれば、選択されたファイルの中身を非同期で読み込み、テキストやデータURLとして扱うことができます。 サンプルコード 以下は、JavaScriptでFileとFileReaderを使用して、ファイルの詳細情報を表示し