JavaScriptで配列の値の前後にゼロ(0)を動的に埋めるアルゴリズム
課題の概要
月を表す配列が与えられ、各要素は1から12の間(両端を含む)の値を取るとします。この配列をもとに、必ず12個の要素を持つ「完全な月配列」を作成するのが今回の課題です。元の配列にその月の値が存在する場合はその値を使用し、存在しない場合はその位置に 0 を入れます。
入力と出力の例
入力 → [5, 7, 9] 出力 → [0, 0, 0, 0, 5, 0, 7, 0, 9, 0, 0, 0]
それでは、実際のコードを見ていきましょう。
実装コード
const months = [6, 7, 10, 12];
const completeMonths = (arr) => {
const completed = [];
for (let i = 1; i <= 12; i++) {
if (arr.includes(i)) {
completed.push(i);
} else {
completed.push(0);
}
}
return completed;
};
console.log(completeMonths(months));
コードの解説
このアルゴリズムの処理の流れは以下のとおりです。
まず、1から12までの数値を順番に繰り返し処理で確認します。各ループ内で、元の配列に includes() メソッドを使って現在の数値が含まれているかどうかを判定します。含まれていればその値を新しい配列に push し、含まれていなければ 0 を push します。これにより、元の配列の要素が正しい位置に配置され、欠けている月の位置には自動的に 0 が埋められた、長さ12の配列が完成します。
実行結果
上記のコードをコンソールで実行すると、次のような出力が得られます。
[
0, 0, 0, 0, 0,
6, 7, 0, 0, 10,
0, 12
]
元の配列に含まれていた 6、7、10、12 はそれぞれ対応する位置に配置され、それ以外の位置は 0 で埋められていることが確認できます。
別のアプローチ:Array.from() と map を活用する
より簡潔に書きたい場合は、Array.from() を使って同様の処理を1行で実現することもできます。
const months = [6, 7, 10, 12];
const completeMonths = (arr) =>
Array.from({ length: 12 }, (_, i) => (arr.includes(i + 1) ? i + 1 : 0));
console.log(completeMonths(months));
この方法では、長さ12の新しい配列を生成しながら、各インデックスに対して元の配列に該当する月が存在するかを三項演算子で判定しています。コードが短くなり、意図も明確になるため、実務でも読みやすい実装と言えます。
まとめ
欠損した月のデータを 0 で埋めて固定長の配列に整形する処理は、グラフ描画や集計データの前処理などでよく使われるテクニックです。for ループによる素直な実装と、Array.from() を使った関数型スタイルの実装の両方を理解しておくと、状況に応じて使い分けができるでしょう。
-
JavaScriptのArray.values()メソッドとは?使い方とサンプルコードを徹底解説
JavaScriptのArray.values()メソッドとは? JavaScriptのArray.values()メソッドは、対象の配列に含まれるすべての値を格納したイテレーターオブジェクトを返します。ES2015(ES6)以降で利用可能なこのメソッドは、for...ofループやスプレッド構文([...arr])と組み合わせることで、配列の各要素を効率的に取り出せます。 なお、keys()やentries()がインデックス情報も一緒に返すのに対し、values()は純粋に「値」だけを順番に提供する点が大きな特徴です。 基本構文 arr.values() 引数は不要で、戻り値として新しいArr
-
JavaScriptでnull・空のオブジェクトを含む配列に値を割り当てる方法
JavaScriptでは、forEach()メソッドとObject.keys()メソッドを組み合わせることで、nullや空のオブジェクトを含む配列に対して効率的に値を割り当てることができます。本記事では、実際のコード例を交えながら、その具体的な実装方法をわかりやすく解説します。 サンプルコード 以下は、JavaScriptを使用してnull/空のオブジェクトを持つ配列に値を割り当てるコード例です。 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&qu