-
JavaScriptで配列の数値を0〜100のスケールに正規化する方法
例えば、複数の数値を含む配列があるとします。ここでの課題は、その配列を受け取り、すべての値を0〜100の範囲に相対的にマッピングする関数を作成することです。具体的には、配列内の最大値は100に、最小値は0に置き換えられ、それ以外の値は最大値と最小値の差(レンジ)に対する比率に基づいて、0〜100の間の対応する数値へと変換されます。この手法はデータの正規化(min-maxスケーリング)と呼ばれ、グラフ描画やデータ比較など、異なるスケールの値を揃えたい場面でよく活用されます。実装コードconst numbers = [45.71, 49.53, 18.5, 8.38, 38.43, 28.44];
-
【JavaScript】配列内で最も頻繁に出現する要素のインデックスを取得する方法
文字列や数値のリテラルを含む配列を受け取り、その中で最も多く出現する要素のインデックスを返す関数を作成することを考えてみましょう。 基本的なアプローチは次のとおりです。 配列を走査しながら、各要素の出現回数を記録した「頻度マップ(frequencyMap)」を作成する 頻度マップの中から、出現回数が最大となる要素を特定する その要素が元の配列のどこにあるかを indexOf() で調べて返す 実装例 const arr1 = [12, 5, 6, 76, 23, 12, 34, 5, 23, 34, 65, 34, 22, 67, 34]; const arr2 = [12, 5, 6,
-
JavaScriptでArray.prototype.slice()をオーバーライドして配列をスライスする方法
JavaScriptでは、標準の Array.prototype.slice() メソッドを独自の実装で上書きすることが可能です。通常、Array.prototype.slice() は「開始インデックス(start)」と「終了インデックス(end)」の2つの引数を受け取り、元の配列の start から end - 1 までの要素を抽出した部分配列を返します。 今回実装したいのは、この動作を変更し、end インデックスの要素も含めて start から end までの部分配列を返す slice() メソッドです。 実装の考え方 実装は以下の手順で行います。 for ループを使って配列を反復
-
JavaScriptの再帰を使って部分和(累積和)の配列を作成する方法
はじめに次のような数値の配列を考えてみましょう。const arr = [10, 5, 6, 12, 7, 1];この配列に対して、先頭から1つずつ要素を減らしながら各部分配列の合計を求めると、以下のようになります。[10, 5, 6, 12, 7, 1] = 10 + 5 + 6 + 12 + 7 + 1 = 41;[5, 6, 12, 7, 1] = 5 + 6 + 12 + 7 + 1 = 31;[6, 12, 7, 1] = 6 + 12 + 7 + 1 = 26;[12, 7, 1] = 12 + 7 + 1 = 20;[7, 1] = 7 + 1 = 8;[1] = 1 = 1;し
-
再帰処理を使ったJavaScriptによるハッピー数の判定方法
ハッピー数とは ハッピー数(Happy Number)とは、各桁の数字を2乗してその和を求めるという操作を繰り返したとき、最終的に1に到達する数のことです。一方、この過程で一度現れた数が再度現れてしまうと、同じサイクルが無限に繰り返されることになり、そのような数は「ハッピー数ではない数」と呼ばれます。 例えば、13はハッピー数です。実際に確認してみましょう。 1^2 + 3^2 = 10 1^2 + 0^2 = 1 このように、13 → 10 → 1 という流れで最終的に1に到達します。一方、36はハッピー数ではありません。 再帰を使った判定関数の実装 ここでは、再帰処理を利用して、ある数が
-
JavaScriptで特定のフィールドをマージしながら配列を集約する方法
例えば、次のようなオブジェクトの配列があったとします。const arr = [{ id: 121, hobby: cycling }, { id: 125, hobby: jogging }, { id: 129, hobby: reading }, { id: 121, hobby: writing }, { id: 121, hobby: playing football }, { id: 125, hobby: cooking }, { id: 129, hobby: hor
-
JavaScriptでカスタムマッピングにより10進数を16進数へ変換するtoHex関数の実装方法
通常、10進数を16進数(基数16)に変換する際は、「0123456789ABCDEF」という文字セットを使って各桁の数値をマッピングします。 この記事では、同じ変換処理を行いながらも、標準の文字セットに縛られず、ユーザーが任意の文字列(スケール)を自由に指定できる関数の実装方法を解説します。 やりたいことの例 10進数 363 の16進数表記は「16B」です。 しかし、ユーザーが「0123456789ABCDEF」の代わりに、 たとえば「qwertyuiopasdfgh」というスケールを使うと決めた場合、 363 は「wus」と表現されます。 これが、今回実装したい機能です。 実装の考え方
-
JavaScriptで指定した合計になる隣接ペアを見つける方法
問題の概要今回は、配列と数値を受け取り、指定された数値と合計が一致する最初のペアのうち、先頭要素のインデックスを返す関数を作成します。もし配列内にそのようなペアが存在しない場合は、-1 を返す必要があります。ここでいう「ペア」とは、配列内の任意の2つの要素ではなく、隣り合う2つの連続した要素を指す点に注意してください。実装例それでは、実際のコードを見てみましょう。forループで配列を先頭から順に走査し、隣接する2つの要素の合計が目標値と一致するかどうかをチェックしていきます。最初に条件を満たした時点でそのインデックスを返し、最後まで見つからなければ -1 を返します。const arr = [
-
JavaScriptで配列内の各整数の階乗を返す関数の作成方法
本記事では、数値の配列を受け取り、各要素に対応する階乗を含む新しい配列を返すJavaScript関数の作成方法を解説します。実装のアプローチはシンプルです。まず、1つの数値を受け取ってその階乗を返す再帰関数を定義します。次に、map()メソッドを使って元の配列を反復処理し、各要素の階乗を計算します。最後に、結果として得られた新しい配列を返します。それでは、実際のコードを見ていきましょう。サンプルコードconst arr = [4, 8, 2, 7, 6, 20, 11, 17, 12, 9]; const factorial = (num, fact = 1) => { &n
-
JavaScriptでオブジェクトから上位n個の値を取得する方法
ここでは、サッカー選手のさまざまな能力値を表す、次のようなオブジェクトを例に考えてみましょう。const qualities = { defence: 82, attack: 92, heading: 91, pace: 96, dribbling: 88, tenacity: 97, vision: 91, passing: 95, shooting: 90 };目標は、このようなオブジェクトと数値 n(n はオブジェクトのキー数以下)を受け取り、値が大きい順に n 個のキーと値のペアを持つ新しいオブジェクトを返す関数を
-
JavaScriptで配列から数値と文字列を分離してソートする方法
はじめにJavaScriptでは、数値リテラルと文字列リテラルが混在した配列を扱うことがあります。本記事では、Array.prototype.sort()メソッドにカスタム比較関数を渡すことで、配列内の要素を「数値」と「文字列」の2つのグループに分離し、それぞれのグループ内でも正しくソートする方法を解説します。実装のポイント鍵となるのは、sort()メソッドに渡す比較関数です。typeof演算子で各要素の型を判定し、以下のルールで並び順を決定します。両方とも数値の場合:a - bを返して数値の昇順にソートするaが数値・bが文字列の場合:-1を返してaを手前に配置するaが文字列・bが数値の場合:
-
JavaScriptで文字列から配列内の単語を削除する方法
文字列と文字列の配列が与えられたとき、配列に含まれるすべての単語を元の文字列から取り除く関数を作成するのが、今回の課題です。削除対象となる部分文字列は完全な単語であるため、単語を取り除いた際に生じる前後の余分な空白も削除し、2つ以上の空白が連続して現れないようにする必要があります。それでは、この関数のコードを実際に書いてみましょう。コード例 { const regex = new RegExp(` ${val}`, g); return acc.replace(regex, ); }, str); }; console.log(removeWords(s
-
【JavaScript】連続する要素をグループ化して配列を圧縮する方法
はじめに本記事では、ハイフン(-)で区切られた単語が含まれる文字列から、連続して出現する同じ単語をグループ化し、それぞれの連続出現回数とともにオブジェクトの配列として返す関数をJavaScriptで実装します。問題の概要まず、次のように繰り返しの単語がハイフン(-)で区切られて含まれる文字列が与えられます。const str = monday-sunday-tuesday-tuesday-sunday-sunday-monday-monday-monday;ここでの課題は、各オブジェクトが val と count という2つのプロパティを持つ配列を返す関数を書くことです。val は文字列内の単
-
JavaScriptで「HH:MM:SS」形式の時刻文字列を秒数に変換する方法
はじめに本記事では、「HH:MM:SS」形式の時刻文字列を受け取り、その合計秒数を返すJavaScript関数の作成方法を解説します。具体的には、以下のような動作を目指します。countSeconds(12:00:00) // 43200 countSeconds(00:30:10) // 1810それでは、実際のコードを見ていきましょう。実装の考え方変換の手順はシンプルで、以下の3ステップで構成されます。時刻文字列を split(:) メソッドで「時・分・秒」に分割する分割された文字列を parseInt() で数値に変換する「時 × 3600 + 分 × 60 + 秒」という計算式で合計秒
-
JavaScriptで配列内の最初の重複要素のインデックスを検索する方法
文字列や数値のリテラルを含む配列には、重複した要素が存在する場合と存在しない場合があります。この記事では、配列を受け取り、最初に重複している要素のインデックスを返す関数の実装方法を解説します。もし配列内に重複する要素がひとつも存在しない場合は、-1 を返す仕様とします。実装の考え方基本的なアプローチは以下の通りです。for ループで配列を先頭から順番に走査するオブジェクト(Map)を用意し、「まだ出現していない要素」をキーとして、そのインデックスを値として保存する走査中にすでに登録済みのキー(=重複要素)に遭遇したら、そのインデックスを即座に返すループが最後まで完了した場合は重複がなかったこと
-
JavaScriptで配列を再帰的に走査し、奇数と偶数を別々の変数に振り分ける方法
概要本記事では、数値の配列を受け取り、奇数と偶数をそれぞれ別の配列に振り分けたオブジェクトを返す再帰関数「pushRecursively()」の実装方法を解説します。最大のポイントは、for文やforEachなどのループ処理を一切使わず、再帰呼び出しだけで処理を完結させるところです。コード例まずは実際のコードを見てみましょう。const arr = [12, 4365, 76, 43, 76, 98, 5, 31, 4];const pushRecursively = (arr, len = 0, odd = [], even = []) => { &n
-
【JavaScript】配列の最大値と最小値の間の数値の合計を計算する方法
今回は、2つの要素を持つ配列 [a, b] を引数として受け取り、a から b までのすべての整数(両端を含む)の合計を返す関数 sumBetween() を作成します。 期待する動作の例 [4, 7] の場合 → 4+5+6+7 = 22 [10, 6] の場合 → 10+9+8+7+6 = 40 このように、引数の順序が逆になっていても(b の方が小さい場合でも)、同じように正しく合計を求められる点がポイントです。 解決のアプローチ:等差数列の和の公式を活用 1からnまでの整数の合計は、有名な等差数列の和の公式「n × (n + 1) ÷ 2」を使えば瞬時に求められます。この公式を利用する
-
JavaScriptでランダムなHEXカラーコードを生成する方法
Web開発では、ランダムな色を生成したい場面がよくあります。例えば、デモアプリケーションの配色や、データの可視化における自動的な色の割り当てなどが挙げられます。本記事では、ランダムなHEX形式(16進数)のカラーコードを返す関数をJavaScriptで実装する方法を解説します。ランダムカラーコード生成の仕組みHEXカラーコードは、「#」に続けて0〜9およびA〜Fの16種類の文字を6つ並べた形式で表されます。つまり、この6文字をランダムに組み合わせることで、約1,677万色(16の6乗 = 16,777,216色)の中から任意の色を生成することが可能です。コード例const generateRa
-
JavaScriptで配列の各要素に従って文字列を分割する方法
JavaScriptでは、文字列と数値の配列が与えられ、その配列の各要素に指定された長さに従って文字列を分割したいケースがあります。例えば、以下のような入力と出力を考えてみましょう。 入力例 const string = Javascript splitting string by given array element; const arr = [2, 4, 5, 1, 3, 1, 2, 3, 7, 2]; 出力例 [Ja,vasc,ript ,s,pli,t,ti,ng ,string ,by] この例では、配列の最初の要素「2」に従って先頭から2文字を切り出し、次の要素「4」に従ってさら
-
JavaScriptで配列内のエントリから正味速度(ネット速度)を計算する方法
ここに、モーターボートが上流(upstream)と下流(downstream)を航行した際の速度データを格納した配列があるとします。それぞれのエントリには「方向」と「そのときの速度」が記録されています。 以下が今回扱うサンプル配列です。 const arr = [{ direction: 'upstream', velocity: 45 }, { direction: 'downstream', &nbs