-
JavaScriptでネストされた配列の全要素を合計する方法【flat()を使わない再帰処理】
ネストされた(入れ子になった)数値の配列を受け取り、その中に含まれるすべての数値の合計を返す関数を作ることを考えてみましょう。ただし、Array.prototype.flat() メソッドは使用しないものとします。このようなケースでは再帰処理を使うのが最も効果的です。配列の各要素を順番に調べ、要素がさらに配列であれば自分自身を再帰的に呼び出し、数値であればそのまま合計に加算していきます。コード例 { let sum = 0; for(let len = 0; len < arr.length; len++){ sum += Array.isArray(arr[l
-
【JavaScript】数値の各桁を逆順に並べた配列へ変換する方法
数値を受け取り、その各桁を逆順に並べた配列として返す関数を作成することを考えてみましょう。実装の手順はシンプルです。まず数値を String() で文字列に変換し、split() を使って1桁ずつの文字列配列に分割します。次に map() で各要素を数値に変換し、最後に reverse() で配列の順序を反転させて返します。数値を逆順の配列に変換する関数以下は、受け取った数値の桁を逆順に並べ替えて配列として返す関数の実装例です。 { const numString = String(num); { &n
-
JavaScriptで特定の単語を優先的に先頭へ、残りをアルファベット順に並べ替える方法
ここでは、文字列を要素とする2つの配列を扱います。一方の配列をアルファベット順にソートする必要がありますが、その配列がもう一方の配列に含まれる単語を持っている場合、それらの単語は必ず先頭に配置し、それ以外の要素だけをアルファベット順に並べ替えるという要件を考えてみましょう。 この処理を実現するために、excludeSort(arr, ex) という関数を作成します。引数 arr はソート対象の配列、ex は arr 内に存在する場合に先頭へ移動させるべき文字列の配列です。 実装例 const arr = [apple, cat, zebra, umbrella, disco, ball,
-
JavaScriptで配列内のNaNを検出する方法|NaN !== NaNの性質とNumber.isNaN()の使い方
真偽値(truthy/falsy)が混在する配列から、元の配列内でNaNに該当する要素のインデックスを抽出する関数の書き方を解説します。NaN !== NaN という特殊な性質NaNのデータ型は実は「number」です。NaNはfalsy(偽値)な値ですが、他のどのデータ型や変数にも存在しない特異な性質を持っています。それが「NaN === NaN が false を返す」という点です。このような挙動を示すのはNaNだけです。この性質をうまく利用すれば、NaNのインデックスを簡単に特定できます。コードは以下のとおりです。const arr = [7, 1, 123abc, undefined,
-
整数をローマ数字に変換するJavaScriptアルゴリズムの解説
今回は、引数として渡された整数値に対応するローマ数字を返す関数 intToRoman() を作成してみましょう。名前の示すとおり、この関数は数値をローマ数字の文字列へと変換します。ローマ数字の基本ルールローマ数字は次の7つの記号で構成されます。I = 1V = 5X = 10L = 50C = 100D = 500M = 1000さらに、4や9のような数値は減算表記と呼ばれる特別な形式で表現されます。具体的には IV(4)、IX(9)、XL(40)、XC(90)、CD(400)、CM(900)です。これらを正しく処理することが変換アルゴリズムのポイントになります。アルゴリズムの考え方ここでは「
-
ローマ数字を10進数に変換するJavaScriptアルゴリズムの実装方法
ローマ数字で表された文字列を受け取り、それを10進数(基数10)の数値に変換して返す関数を作成する必要があります。本記事では、その関数を実際のコードとともにわかりやすく解説します。 ローマ数字の基本ルール ローマ数字は「I・V・X・L・C・D・M」の7種類の記号で構成され、それぞれ1・5・10・50・100・500・1000に対応しています。基本的には左から右へ値を足していきますが、「IV(4)」「IX(9)」「XL(40)」のように、小さい記号が大きい記号の前に置かれる場合は引き算になるという減算ルールが存在します。このルールを正しく処理することが、変換アルゴリズムのポイントです。 実装コー
-
【JavaScript】2つのオブジェクトを1つにマージし、同じキーの値を合計する方法
本記事では、2つのオブジェクトを引数として受け取り、それらを1つのオブジェクトにマージしながら、同じキーを持つ値を合計する関数をJavaScriptで作成します。この処理には「線形時間(O(n))・定数空間(O(1))」という制約があります。つまり、ループは最大1回までしか使用できず、既存のオブジェクトのプロパティをそのまま更新してマージする必要があります。新しい変数やオブジェクトは作成しません。実装例それでは、この関数のコードを見ていきましょう。 { for(key in obj1){ if(obj2[key]){ obj1[key] += o
-
JavaScriptで配列を再帰的にループし、一致する要素の数を返す方法
ネストされた(入れ子構造の)配列の中から、指定した検索語が出現する回数を数える関数、たとえば searchRecursively() を作成してみましょう。この関数は配列と検索クエリを受け取り、そのクエリが配列全体に合計何回登場するかを返します。 例として、次のような配列が与えられた場合を考えてみます。 const names = [rakesh, [kalicharan, krishna, rakesh, james, [michael, nathan, rakesh, george]]]; このとき、 searchRecursively(names, rakesh); は 3 を返す必要が
-
JavaScriptで連続する同じ数値を合計して配列にまとめる方法
JavaScriptで連続する同じ数値を合計する今回は、配列を受け取り、連続して並んでいる同じ数値を合計してまとめた新しい配列を返す関数を作成する方法を解説します。例えば、次のような配列があったとします。const array = [1, 5, 5, 5, 8, 8, 9, 1, 4, 4, 2];この場合、期待される出力は以下の通りです。[1, 15, 16, 9, 1, 8, 2]連続する3つの「5」は合計されて「15」に、連続する2つの「8」は「16」に、連続する2つの「4」は「8」にまとめられています。離れた位置にある同じ数値(例えば先頭の「1」と途中の「1」)は、連続していないためそ
-
JavaScriptで配列内の最長・最短の文字列を取得する方法
次のような文字列リテラルの配列があるとします。 const arr = [Some, random, words, that, actually, form, a, sentence.]; この配列の中から、最も長い単語と最も短い単語を返す関数を作成する必要があります。ここでは、Array.prototype.reduce() メソッドを使用し、配列全体を一度だけ走査する過程で最長・最短の単語を追跡していきます。ループを複数回実行する必要がないため、シンプルかつ効率的なアプローチです。 コード例 acc[longest][length]){ acc[longest]
-
JavaScriptで再帰関数を使ってフィボナッチ数列を生成する方法
本記事では、再帰(リカージョン)を活用してフィボナッチ数列を生成するJavaScriptの関数の実装方法を解説します。実装する関数の仕様今回作成するのは、引数として数値 n を受け取り、フィボナッチ数列の最初の n 個の要素を配列として返す再帰関数 fibonacci() です。再帰処理では、デフォルトパラメータを利用することで、外部から補助的な値を渡す必要がなく、シンプルな呼び出しを実現できます。具体的には、以下のような役割を持つパラメータを用意します。n: 残りの生成回数res: これまでに生成された数列を格納する配列count: 現在のフィボナッチ数last: 直前のフィボナッチ数コード
-
【JavaScript】数値が回文数かどうかを文字列変換なしで判定する方法
はじめに 本記事では、与えられた数値が回文数(パリンドローム)であるかどうかを判定する関数を JavaScript で実装します。 ここでの重要な制約は「数値を文字列やその他のデータ型に変換せずに」判定することです。つまり、純粋な数値演算だけで処理を完結させる必要があります。 回文数とは? 回文数とは、前から読んでも後ろから読んでも同じ数字になる数値のことです。例えば、以下のような数値が該当します。 121 343 12321 実装の方針 文字列変換を使わない代わりに、次の手順で先頭と末尾の桁を順番に比較していきます。 まず、数値の桁数に対応した係数(factor)を求めます。これにより
-
JavaScriptの再帰関数を使ってnまでの偶数の合計を求める方法
今回は、数値 n を引数として受け取り、n までのすべての偶数の合計を返す再帰関数をJavaScriptで作成していきます。再帰とは、関数が自分自身を呼び出すことで処理を繰り返す手法です。ループ文を使わずに合計値を求められるため、再帰の仕組みを理解するのに最適な題材といえます。コード例 { // 奇数の場合は1つ前の偶数に調整 num = num % 2 === 0 ? num : num - 1; if(num){ return recursiveEvenSum(num - 2, sum + num); } return sum; };
-
JavaScriptで配列から特定の数値要素を削除する方法【再帰とfilter活用】
はじめに 本記事では、「数値の配列」と「削除対象の数値」を受け取り、その数値と一致するすべての要素を元の配列から直接(in-place)削除する関数をJavaScriptで実装する方法を解説します。 このような処理を実現するには、再帰呼び出しを利用する方法が効果的です。指定した要素のすべての出現箇所を配列から取り除く再帰関数は、以下のように記述できます。 コード例 const numbers = [1, 2, 0, 3, 0, 4, 0, 5]; const removeElement = (arr, element) => { if (arr.indexOf(
-
JavaScriptで配列内のn番目に出現する要素のインデックスを取得する方法
今回は、配列 arr、文字列または数値リテラル txt、そして数値 n を引数として受け取る関数 getIndex() を作成します。この関数は、arr の中で txt が n 回目に出現する位置(インデックス)を返す必要があります。もし txt が n 回出現しない場合は、-1 を返します。 では、実際に関数を実装してみましょう。 サンプルコード { if(val === txt){ if(acc.count+1 === n){ acc[index] = ind; };
-
JavaScriptで複数の配列から重複しない一意な要素だけを抽出する方法
JavaScriptでは、「配列の中に配列が入った構造」を受け取り、元のデータに含まれるすべての要素を集めたうえで、重複している要素を取り除いた新しい配列を返す関数を作成できます。この記事では、その実装方法を具体的なコード例とともに解説します。処理の流れたとえば、次のような入れ子になった配列を入力とした場合を考えてみましょう。const arr = [ [12, 45, 65, 76, 76, 87, 98], [54, 65, 98, 23, 78, 9, 1, 3], [87, 98, 3, 2, 123, 877, 22, 5, 23, 67] ];この場合、期待
-
JavaScriptで配列内の数値を正の数と負の数に分割して別々の配列に格納する方法
概要 配列を受け取り、positive(正の数)と negative(負の数)という2つのプロパティを持つオブジェクトを返す関数を作成します。各プロパティには、元の配列から分類された正の数・負の数がそれぞれ配列として格納されます。 このタスクは非常にシンプルです。Array.prototype.reduce() メソッドを使えば、条件に合致する要素を取り出しながら、2つの配列からなる1つのオブジェクトへ効率よく振り分けることができます。配列全体を1回だけ走査すればよいため、パフォーマンス面でも優れたアプローチです。 実装例 { if(val < 0){
-
JavaScriptでNaN値を常に配列の末尾に並べ替える方法
文字列と数値が混在した配列を扱う際、「通常の数値 → 文字列 → NaN」の順に並べ替えたいケースはよくあります。この記事では、NaN値を常に配列の一番下(末尾)に配置できるソート関数の実装方法を解説します。 課題:NaNの判定は一筋縄ではいかない 一見シンプルな処理に思えますが、いくつか落とし穴があります。まず、typeof NaN は number を返すため、!number && !string のような単純な型チェックではNaNを判別できません。 さらに、要素の真偽値(truthy / falsy)だけで判定しようとすると、空文字列 や undefined もfals
-
JavaScriptで乱数を使って文字列を固定長までパディングする方法
文字列処理を行っていると、「短い文字列を指定した長さまで埋めて(パディングして)返したい」というケースに出会うことがあります。本記事では、乱数を使って文字列の末尾を埋め、指定された固定長に揃える関数をJavaScriptで実装する方法を解説します。要件の整理まず、実装すべき関数 padString() の仕様を確認しましょう。第1引数:パディング対象の文字列第2引数:目標となる長さ(数値)元の文字列の長さは、常に目標の長さ以下である文字列の末尾にランダムな数字を追加し、長さがちょうど目標値と一致するようにする最終的に新しい文字列を返す実装コードこの問題は、再帰処理を使うと非常にシンプルに書くこ
-
JavaScriptでオブジェクト内のnull・偽値(falsy)を「-」に一括置換する方法
JavaScriptでは、多くのキーを持つオブジェクトを受け取り、その中のすべての偽値(falsy value)をダッシュ「-」に置き換える関数を実装したい場面があります。この記事では、元のオブジェクトをそのまま走査し、偽値が格納されているキーを検出して、余分なメモリを消費することなく(in-placeで)「-」に置き換える方法を解説します。JavaScriptにおける偽値(falsy)とは実装の前に、JavaScriptで条件式の中で「偽」と評価される値を確認しておきましょう。以下の6つが代表的な偽値です。false(真偽値) / (空文字列)null(意図的な「無」を表す値)undefin