-
JavaScriptで2つの配列の共通要素(交差)を求める方法
問題の概要2つの数値の配列が与えられたとき、それらの共通部分(交差)を計算し、共通する要素を含む配列を返す関数 intersection() を作成します。結果の配列内の各要素は、両方の配列に出現する回数だけ含まれる必要があります。要素の並び順は問いません。例えば、次のような入力と出力になります。入力: arr1 = [1,2,3,1], arr2 = [1,3,1] 出力: [1,3,1]アプローチもし配列があらかじめソートされていれば、「ツーポインタ法」が有効です。2つのポインタをそれぞれの配列の先頭(インデックス0)に置き、値を比較しながら対応するポインタを進めていくことで、O(m+n)
-
JavaScriptで実装するRubyのeach_cons()メソッド
Rubyのeach_cons()メソッドとはRubyのeach_cons()は、Enumerableモジュールに組み込まれたメソッドの一つです。各要素を起点として、連続するN個の要素を順番に取り出しながら繰り返し処理を行います。ブロックを渡さなかった場合には、Enumeratorを返します。 JavaScriptにおけるeachCons()相当の実装ここでは、数値の配列(このケースではRubyのEnumerableに相当するもの)を例に考えてみましょう。eachCons関数は、配列の各要素に対して実行され、引数として数値N(Nは配列の長さ以下)を1つだけ受け取るArrayの関数である必要があり
-
JavaScriptでバタフライシャッフルを実装する方法をわかりやすく解説
バタフライシャッフルとはJavaScriptにおける「バタフライシャッフルされた配列」とは、数値の配列を、中央に近づくほど値が減少し、末尾に近づくほど値が増加するように並べ替えたものです。この場合、最も大きな数値が配列の先頭に配置されます。別のバリエーションとして、中央に向かって増加し、末尾に向かって減少するパターンも存在します。この場合は逆に、最も小さい数値が先頭に配置されます。数学のバックグラウンドをお持ちの方なら、正規分布(ガウス分布)の形状に少し似ていると感じられるかもしれません。山が中央にあり、両端に向かって裾広くなるイメージです。具体例たとえば、次のような配列があるとします。con
-
【JavaScript】ネストされたオブジェクトの階層の深さ(depth)を再帰的に求める方法
問題の概要 JavaScriptでは、childrenプロパティで子要素を持つオブジェクトが、次のように何段階にもネストした配列として表現されることがあります。 const arr = [{ id: 0, children: [] }, { id: 1, children: [{ id: 2, children: [] }, { id: 3, children: [{ id: 4, children: [] }] }] }]; 今回の課題は、この配列を受け取り、各ネストされたオブジェクトにd
-
JavaScriptでオブジェクト配列の各キーの合計値を計算する方法
例えば、複数のスポーツにおけるプレイヤーのスコアを格納した配列があるとします。スコアは次のようなオブジェクトの配列として表されます。const scores = [ {sport: 'cricket', aman: 54, vishal: 65, jay: 43, hardik: 88, karan:23}, {sport: 'soccer', aman: 14, vishal: 75, jay: 41, hardik: 13, karan:73}, &n
-
文字列を受け取り、アルファベットを鏡写し(反転)に変換するJavaScript関数の作り方
はじめに本記事では、文字列を受け取り、その中のアルファベットをすべて「鏡写し(ミラーリング)」に変換するJavaScript関数を作成します。期待される動作は以下のとおりです。入力:「abcd」出力:「zyxw」つまり、a↔z、b↔y のように、アルファベット順でちょうど反対側に位置する文字へと置き換えていきます。アプローチの解説この処理の考え方は非常にシンプルです。文字列内の各文字を、「26 − N」個離れた位置のアルファベットへマッピングします。ここで N はその文字の1始まりのインデックスです(例:e なら 5、j なら 10)。実装には String.prototype.replace
-
JavaScriptで配列に基づいてオブジェクトのプロパティをフィルタリングする方法
はじめに本記事では、オブジェクトと文字列の配列を引数として受け取り、配列内に出現するキーだけを持つフィルタリング済みのオブジェクトを返すJavaScript関数の作成方法を解説します。例えば、オブジェクトが {"a": [], "b": [], "c": [], "d": []} であり、配列として ["a", "d"] を指定した場合、期待される出力は次のようになります。{"a": [], "d": []}それでは、この関数を実装して
-
JavaScriptで偶数を先頭に集めて昇順ソートする方法
正負の値や偶数・奇数が混在した数値の配列を扱う場面は少なくありません。本記事では、配列を昇順に並べ替えると同時に、偶数をすべて奇数より前に配置し、それぞれのグループ内でも昇順にソートする方法を解説します。 要件の整理 今回実現したいソートの条件は以下のとおりです。 偶数はすべて奇数よりも先に配置する 奇数はすべて偶数の後に配置する 偶数同士・奇数同士は、それぞれ昇順に並べる 入力例と出力例 たとえば、次のような配列が入力されたケースを考えてみましょう。 const arr = [-2, 3, 6, -12, 9, 2, -4, -11, -8]; この場合、期待される出力は次のとおりです。
-
JavaScriptの配列から特定の要素を削除する方法【Array.prototype.remove()の実装】
Array.prototype.remove()メソッドの実装 JavaScriptの標準APIには、配列から「特定の要素を指定して削除する」メソッドは用意されていません。splice()を使えば削除自体は可能ですが、削除したい要素のインデックスを事前に調べる必要があります。そこでこの記事では、値または条件関数を渡すだけで要素を削除できるカスタムメソッドArray.prototype.remove()を実装する方法を解説します。 関数の仕様 この関数は引数を1つ受け取ります。引数には、コールバック関数、または配列の要素となり得る値のいずれかを指定します。 引数が関数の場合:その関数の戻り値に
-
JavaScriptで複数の値の配列内の位置(インデックス)を検索して返す方法
この記事では、2つの配列を引数として受け取り、第2の配列に含まれる要素が第1の配列内のどの位置(インデックス)にあるかをすべて返す関数「findPositions()」を作成します。 やりたいこと たとえば、次のような2つの配列があるとします。 第1の配列:[john, doe, chris, snow, john, chris] 第2の配列:[john, chris] この場合、john と chris が第1の配列内に存在する位置をすべて取得するため、期待される出力は以下のようになります。 [0, 2, 4, 5] john はインデックス0と4、chris はインデックス2と5に存在する
-
JavaScriptの再帰関数で文字列から英字のみを抽出する方法
本記事では、英字と数字が混在した文字列を引数として受け取り、英字のみで構成される新しい文字列を返す再帰関数「pickString」の実装方法を解説します。ループ文を使わず、再帰呼び出しだけでこの処理を実現するのがポイントです。 要件の確認 まず、期待される動作を具体例で確認しておきましょう。 入力:dis122344as65t34er 出力:disaster このように、文字列に含まれる数字をすべて取り除き、残った英字を元の順序どおり連結した結果を返します。 コード例 const str = ex3454am65p43le; const pickString = (str, len = 0,
-
JavaScriptでmとnの大小関係に関係なく、nからmまでの偶数の合計を求める方法
本記事では、2つの数値 m と n を引数として受け取り、その間に存在するすべての偶数(両端を含む)の合計を返す関数をJavaScriptで作成します。ポイントは、n < m の場合でも n > m の場合でも、引数の順序にかかわらず正しい結果を返す必要があるという点です。具体例たとえば、m = 10、n = -4 が与えられた場合を考えてみましょう。m = 10、n = -4 の場合このときの出力は、10 + 8 + 6 + 4 + 2 + 0 + (-2) + (-4) = 24 となります。負の数が含まれていても、また引数の順序が逆でも、正しく計算できることが求められます。ア
-
JavaScriptでオブジェクトの配列から特定プロパティの平均値を計算する方法
はじめにJavaScriptでは、オブジェクトが格納された配列から特定のプロパティの値を集計したいケースはよくあります。本記事では、各オブジェクトが持つ「age(年齢)」プロパティを例に、reduce()メソッドを使って平均値を計算する方法を解説します。サンプルデータまず、次のようなオブジェクトの配列を用意します。各オブジェクトには name と age の2つのプロパティが含まれています。const people = [ { name: Anna, age: 22 }, { name: Tom, age: 34 }, { name: John, age: 12 }, { na
-
【JavaScript】文字列の偶数番目・奇数番目の文字を分離して入れ替える方法
はじめにこの記事では、JavaScriptで文字列から1文字おき(先頭の文字からスタート)に文字を取り除き、取り除いたすべての文字を文字列の末尾に追加する関数の作り方を解説します。やりたいことたとえば、次のような変換を行います。入力:This is a test! 出力:hsi etTi sats!これは「0番目・2番目・4番目…」といった偶数インデックスの文字(T、i、空白、s、a、t、s、!)をすべて取り除いて後ろに回し、残りの文字(h、s、i、空白、空白、e、t)を前に置くことを意味します。実装例const string = This is a test!; const separate
-
【JavaScript】配列の合計値に対する指定パーセント以内となる部分配列を先頭から抽出する方法
問題の概要まず、次のような数値の配列を用意します。const numbers = [10,6200,20,20,350,900,26,78,888,10000,78,15000,200,1280,2000,450];ここで作成する関数は、数値の配列と0〜100 の範囲の数値(パーセントを表す値、ここでは仮に x と呼びます)の2つの引数を受け取ります。関数の役割は、配列全体の合計値に対する x% に達するか、ちょうど下回るまでの間、元の配列の先頭から n 個の要素で構成される部分配列を返すことです。具体例で理解するよりシンプルな例を見てみましょう。const numbers = [12, 10
-
【JavaScript】配列の各要素に対して「自分以外の全要素の積」を求める方法
今回は、数値の配列を引数として受け取る関数を作成する方法を解説します。この関数は、現在計算中のインデックスの値を除いた、それ以外のすべての数値の積からなる新しい配列を返します。 問題の概要 具体的に説明しましょう。たとえば、配列 arr が5つのインデックスを持っていて、インデックス1の値を作成する場合、インデックス0、2、3、4の数値同士を掛け合わせます。 同様に、インデックス2の値を作成する場合は、インデックス0、1、3、4の数値を掛け合わせます。以降も同じ要領で処理を進めていきます。 注意: この問題では、配列内のすべての要素がゼロではないことが保証されています。そのため、割り算による除
-
【JavaScript入門】英単語で書かれた数字列を整数に変換する方法
はじめに本記事では、文字列を唯一の引数として受け取り、それに対応する数値を返す関数の実装方法を解説します。たとえば、以下のような変換を行います。one five seven eight -------> 1578 Two eight eight eight -------> 2888この問題は非常にシンプルです。空白文字で区切られた単語の配列を反復処理しながら、各単語に対応する数値を結果に加算していけばよいのです。実装の考え方まず、0から9までの英語表記を格納した配列(レジェンド)を用意します。次に、入力文字列を小文字に変換してから空白で分割し、reduceメソッドを使って各単語
-
JavaScriptでナルシシスト数(水仙数)を判定する方法
ナルシシスト数とは ナルシシスト数(水仙数・アームストロング数とも呼ばれます)とは、各桁の数字を「桁数」乗した値の合計が、元の数と等しくなるような整数のことです。 例えば次のような数が挙げられます。 153 = 1^3 + 5^3 + 3^3 = 1 + 125 + 27 = 153 この例では、153は3桁の数なので、各桁を3乗して合計すると元の153に戻ります。同様に、1桁の数はすべて自分自身の1乗と一致するため、次のように1もナルシシスト数です。 1 = 1^1 = 1 他にも、370 = 3³ + 7³ + 0³、1634 = 1⁴ + 6⁴ + 3⁴ + 4⁴ などがナルシシスト数
-
2進数の文字列を10進数に変換するJavaScriptプログラム
文字列として与えられた2進数を受け取り、それに相当する10進数の数値を返すJavaScript関数を作成してみましょう。アルゴリズムの考え方実装は非常にシンプルです。forループで文字列を左から順に走査し、各ビットを読み込むたびに「現在の数値を2倍してから、そのビットの値(0または1)を加算する」という処理を繰り返します。これはホーナー法として知られる手法です。例えば「1101」の場合、計算は次のように進みます。1 → 1×2+1=3 → 3×2+0=6 → 6×2+1=13コード例const binaryToDecimal = binaryStr => { &nb
-
JavaScriptで2つの文字列を比較し、片方が部分文字列かどうかを判定する方法
概要この課題では、2つの文字列を入力として受け取り、一方がもう一方の部分文字列である場合には true を、そうでない場合には false を返す関数を作成します。たとえば、次のような動作になります。isSubstr(hello, hello world) // trueisSubstr(can I use, I us) // trueisSubstr(can, no we are) // false考え方部分文字列の関係はどちらの文字列が長いかによって判定する必要があるため、まず2つの文字列のうち文字数が多い方(より長い方)を特定します。そして、その長い方の文字列に対して includes(