-
JavaScriptでマルチセットのすべての分割(パーティション)を見つける方法 ― 各部分集合に重複要素がない場合
問題の概要 たとえば、次のような配列があるとします。 const arr = [A, A, B, B, C, C, D, E]; ここで必要なのは、配列の全要素をちょうど一度ずつ使い切るような「分割(パーティション)」をすべて列挙するアルゴリズムです。ただし、各部分集合の中に同じ要素が2回以上現れてはいけません。 組み合わせの例は次のとおりです。 [A, B, C, D, E] [A, B, C] [A, B, C, D] [A, B, C, E] [A, B, C] [A, B, C] [D, E] 条件の整理 [A, B, C] [A, B, C] [D, E] と [A, B, C] [
-
JavaScriptで片方のオブジェクトに余分なキーがある場合のJSONオブジェクト比較方法
JavaScriptでは、片方のオブジェクトがもう片方より多くのキーを持っている場合でも、共通するキーの値だけを比較したい場面があります。本記事では、どちらかのデータを削除することなく、2つのJSONオブジェクトを比較してブール値(true / false)を返す関数の実装方法を解説します。 問題の確認 まず、次のような2つのJSONオブジェクトを例に考えてみましょう。 const obj1 = {a: apple, b: banana, c: carrot}; const obj2 = {a: apple, e: egg, b: banana, c: carrot, d: dog}; ここで
-
JavaScriptでオブジェクト配列から重複するidキーを持つ要素を削除する方法
例えば、次のようなURLとidを持つオブジェクトの配列があるとします。 const arr = [ { url: www.example.com/hello, id: 22 }, { url: www.example.com/hello, id: 22 }, { url: www.example.com/hello-how-are-you, id: 23 }, { url: www.example.com/i-like-cats
-
JavaScriptで複数の配列からすべての組み合わせ(デカルト積)を生成する方法
JavaScriptで複数の配列から組み合わせを生成するJavaScriptでは、要素数の異なるn個の配列から、それぞれの配列から1つずつ要素を選び出し、そのすべての組み合わせ(デカルト積)を生成したいケースがあります。本記事では、配列の個数が可変でも対応できる汎用的な実装方法を解説します。扱うデータの例まず、次のようなデータを考えてみましょう。const arr = [ [0,1], [0,1,2,3], [0,1,2] ]このデータは3つのサブ配列
-
JavaScriptで数値オブジェクトから指定値以上の最も近いキーを取得する方法
JavaScriptでは、複数の数値を持つオブジェクトの中から、入力として渡された特定の数値と同じ値、またはそれより大きい最も近い数値に対応するキーを取得したいケースがあります。本記事では、reduce() メソッドを活用したシンプルな実装方法を、コード例とともにわかりやすく解説します。 対象となるデータ 今回使用する数値の集合は、以下のようにキーと値のペアで定義されています。 const numbers = { A:107, B:112, C:117, D:127, E:132, F:140, G:117, H:127,
-
JavaScriptで2つの配列のすべての組み合わせを生成する方法
はじめにJavaScriptでは、2つの配列の要素を掛け合わせるように組み合わせたいケースがよくあります。例えば、以下のような2つの文字列の配列があるとします。const arr1 = [A, B, C]; const arr2 = [1, 2, 3];この2つの配列を受け取り、1つ目の配列の各要素と、2つ目の配列の各要素をすべて組み合わせて、新しい配列として返す関数を作成する必要があります。つまり、上記の入力に対する期待される出力は次のようになります。const output = [A1, A2, A3, B1, B2, B3, C1, C2, C3];これは数学における「デカルト積(直積)
-
JavaScriptで数値の各桁の数字を一つずつ分割表示する方法
はじめに この記事では、ユーザーが入力した数値を検証し、有効な数値であればその各桁の数字を画面に一つずつ表示するJavaScriptプログラムの作り方を解説します。 動作イメージ ページ上のボタンをクリックすると入力ダイアログが開き、そこに数値を入力してOKを押すと、入力された数値の各桁が一行ずつ画面に出力される仕組みです。 例えば、入力が次のような場合—— 43354 画面には次のように表示されます。 4 3 3 5 4 完成コード HTML <!DOCTYPE html> <html> <head> &n
-
JavaScriptで配列内の同じ値を持つオブジェクトの出現回数をカウントする方法
JavaScriptでは、オブジェクトの配列の中に、特定のプロパティ値を持つ要素がいくつ含まれているかを集計したいケースがよくあります。本記事では、フライトの路線情報を表すオブジェクト配列を例に、return プロパティの値ごとに出現回数をカウントする方法を解説します。 問題の概要 まず、次のようなフライト路線を表すオブジェクトの配列があるとします。 const routes = [ { flyFrom: CDG, flyTo: DUB, return: 0, }, { flyFrom: DUB, flyTo: SXF, retur
-
【JavaScript】オブジェクトをキーと値のペアごとのオブジェクト配列に分割する方法
JavaScriptでは、1つのオブジェクトにまとめられた複数のキーと値のペアを、それぞれ独立したオブジェクトへ分割し、「オブジェクトの配列」として扱いたいケースがあります。本記事では、その実現方法を、実際に動作するサンプルコードとともにわかりやすく解説します。 元になるオブジェクト 例として、次のような10個のプロパティを持つオブジェクトを用意しました。 const obj = { value 0: value, value 1: value, va
-
【JavaScript】配列の前半と後半を混ぜずに個別に昇順ソートする方法
はじめに JavaScriptでは、配列全体ではなく一部だけを並べ替えたいというケースがあります。本記事では、「オブジェクトを多数含む配列に対して、前半部分を昇順でソートし、後半部分も昇順でソートする。ただし、前半と後半の要素が互いに混ざり合わないようにする」という要件を満たす関数の実装方法を解説します。 サンプルデータ まず、次のような配列を用意します。 const arr = [ {id: 1, x: 33}, {id: 2, x: 22}, {id: 3, x: 11}, {id: 4, x: 3}, {id: 5, x: 2}, {id
-
【JavaScript】文字列として渡された数式を評価して計算する方法
文字列の数式を評価して計算結果を返す本記事では、文字列形式で渡された数式を解析し、その計算結果を返すJavaScript関数の作成方法を解説します。例えば、次のような数式が引数として与えられた場合を考えてみましょう。const str = 1+23+4+5-30;この場合、1 + 23 + 4 + 5 − 30 の計算が行われ、期待される出力は 3 となります。実装コードこの問題を解決するコードは以下の通りです。const str = 1+23+4+5-30; const compute = (str = ) => { let total
-
JavaScriptで配列内にターゲット平均と一致する値のペアが存在するか判定する方法
本記事では、ソート済みの整数配列とターゲットとなる平均値をそれぞれ第1引数・第2引数として受け取るJavaScript関数の作成方法を解説します。この関数の役割は、配列内に「2つの値からなるペア」が存在し、そのペアの平均値がターゲット平均と一致するかどうかを判定することです。効率的な解き方:両端ポインタ(ツーポインタ)法この問題は、追加の空間計算量 O(1)、時間計算量 O(n) で解決できます。ポイントは、配列がすでにソートされているという点です。ソート済みであれば、次の2つのインデックスを使うアプローチが有効です。y: 配列の先頭から末尾へ向かって進むインデックスx: 配列の末尾から先頭へ
-
JavaScriptで文字列内の各数字の出現回数をオブジェクトとして集計する方法
問題の概要次のような、数字だけで構成された長い文字列があると仮定します。const str = 11222233344444445666;ここで求められているのは、このような文字列を受け取るJavaScript関数を作成することです。この関数は、文字列中に出現するそれぞれの一意な数字に対して、固有の「id」プロパティと、その数字が文字列内に何回出現したかを記録する「displayed」プロパティを持つオブジェクトを割り当てた結果を返す必要があります。期待される出力上記の文字列の場合、出力は次のようになります。const output = { 1: { id: 1, displayed:
-
JavaScriptで5つの整数のうち4つを合計して求める最小値と最大値の計算方法
正の整数が5つ格納された配列が与えられます。このとき、5つの整数のうちちょうど4つを選んで合計したときに得られる値の中から、最小値と最大値を求めましょう。結果は、最小値と最大値をスペースで区切った1行の整数として出力します。なお、入力となる配列は必ずしもソートされていない点に注意が必要です。問題の例たとえば、次のような配列を考えてみます。const arr = [1, 3, 5, 7, 9]この場合、最小の合計値は次のようになります。1 + 3 + 5 + 7 = 16一方、最大の合計値は次のとおりです。3 + 5 + 7 + 9 = 24したがって、関数の戻り値は以下のようになります。[16
-
JavaScriptで「_id」キーの値が同じオブジェクトをグループ化して集計する方法
まず、次のようなオブジェクトの配列があると仮定します。const arr = [ {_id : 1, S : 2}, {_id : 1, M : 4}, {_id : 2, M : 1}, {_id : 6 , M : 1}, {_id : 3, S : 3} ];この配列を受け取り、「_id」キーの値が同じオブジェクト同士をひとつのグループにまとめ、さらに各キーの数値を合計したTotal付きの結果を返すJavaScript関数を作成する必要があります。最終的な出力は次のようになります。const output = [ {_id : 1, M :
-
JavaScriptでキー値を使って2つのオブジェクトから新しいオブジェクトを作成する方法
次のような2つのオブジェクトがあるとします。 const obj1 = { positive: [happy, excited, joyful], negative: [depressed, sad, unhappy] }; const obj2 = { happy: 6, excited: 1, unhappy: 3 }; ここで求められているのは、これら2つのオブジェクトを引数として受け取るJavaScript関数です。この関数は、obj1の各カテゴリ(positive / negative)に含まれる単語をキーとしてobj2から対応するスコアを取得し、その合計値を計算
-
JavaScriptで2つの数値範囲の重なり(共通部分)を求める方法
JavaScriptでは、配列のペアを使って「範囲」を表現できます。例えば、[2, 5]という配列は「2から5までの範囲」を意味します。本記事では、このように表現された2つの範囲を受け取り、その共通部分(交差している範囲)を新しい配列として返す関数の実装方法を解説します。問題の定義次のように、2つの範囲を表す配列が与えられたとします。const arr1 = [2, 5]; // 2〜5 の範囲 const arr2 = [4, 7]; // 4〜7 の範囲これら2つの範囲に共通して含まれる部分は「4から5まで」です。したがって、期待される出力は以下のようになります。const output
-
JavaScriptで配列内の最頻値(最も共通する要素)を取得する方法
繰り返しの値を含むリテラルの配列を受け取り、その中で最も多く出現する要素(最頻値)を配列として返すJavaScript関数を作成する必要があります。2つ以上の要素が同じ回数だけ最も多く現れる場合は、該当するすべての要素を結果の配列に含めなければなりません。実装コード例この処理を実装したコードは以下のとおりです。const arr1 = [a, c, a, b, d, e, f]; const arr2 = [a, c, a, c, d, e, f]; const getMostCommon = arr => { const count = {}; let res = []
-
JavaScriptで欠落している演算子を補って方程式を完成させる方法
数値の並びを受け取り、等式が成立するような正しい演算子の組み合わせを返すJavaScript関数を作成することを考えます。使用できる演算子は (+、−、*、/、^、%) の6種類です。問題の概要期待される入力と出力の関係は次のとおりです。入力 : 5 3 8 出力 : 5+3=8 入力 : 9 27 3 出力 : 9=27/3 入力 : 5 2 25 , 1 5 2 出力 : 5^2=25 , 1=5%2各入力には必ず少なくとも1つの解が存在することが保証されており、そのうち1つの正しい組み合わせを返すことが求められます。解法のアプローチこの問題を解くための基
-
JavaScriptで自己分割数を判定する方法をわかりやすく解説
本記事では、引数として受け取った数値が自己分割数(Self-Dividing Number)であるかどうかを判定するJavaScript関数の作成方法を解説します。 自己分割数とは? 自己分割数とは、その数を構成するすべての桁の数字で割り切れる数のことです。判定関数は、結果に応じて次のようにメッセージを出力します。 自己分割数の場合:「この数値は自己分割数です」 自己分割数でない場合:「この数値は自己分割数ではありません」 具体例 128:1・2・8 のどの数字でも 128 を割り切れるため、自己分割数です。 102:「0」という桁を含んでいるため、自己分割数ではありません(0 で割