-
JavaScriptでJSONオブジェクトのネストされた値を配列に変換する方法
この記事では、ネストされたJSONオブジェクトから特定のプロパティ(ここでは「rssi」)の値だけを取り出し、配列の配列として整理する方法を解説します。 対象となるJSONオブジェクト まず、次のようなJSONオブジェクトを想定します。 const obj = { test1: [{ 1: { rssi: -25, } }, { 2: { rssi: -25, } }], test2: [{ 15: { rssi: -10, } }, { 19: { rssi: -21
-
JavaScriptで配列内の数値のみを抽出して合計する方法
問題の概要配列を受け取り、その中に含まれる数値のみを抽出して合計を返すJavaScript関数を作成します。この配列には、数値リテラル、文字列リテラル、オブジェクト、undefinedなど、さまざまな型の値が混在している可能性があります。そのため、数値以外の要素はすべて無視し、数値だけを足し合わせる処理が必要です。実装例 { let sum = 0; for(let i = 0; i < arr.length; i++){  
-
JavaScriptで文字列の大文字の使い方が正しいかどうかを判定する方法
本記事では、次の3つのルールに基づいて「大文字の正しい使用」を定義します。単語内のすべての文字が大文字である(例:「INDIA」)単語内のすべての文字が大文字ではない(例:「example」)単語の先頭の文字のみが大文字である(例:「Ramesh」)この条件をもとに、文字列を受け取り、その文字列が上記3つのルールのいずれかに合致するかどうかを判定するJavaScript関数を作成します。合致する場合は true を返し、そうでない場合は false を返します。実装例const detectCapitalUse = (word = ) => { let allC
-
JavaScriptで文字列内の各単語を反転させる方法
問題の概要空白(スペース)を含む可能性のある文字列を引数として受け取るJavaScript関数を作成する必要があります。この関数は、まず文字列をスペースで単語ごとに分割し、それぞれの単語内の文字順序を逆にしてから、再度結合して新しい文字列として返します。たとえば、入力文字列が次の場合:const str = this is a word;期待される出力は以下のとおりです。const output = siht si a drow;解決策:split・reverse・joinを活用するこの問題は、文字列操作の基本である split()、reverse()、join() の3つのメソッドを組み合わ
-
【JavaScript】二分探索(バイナリサーチ)の実装方法:検索値が存在すればインデックスを返す
本記事では、ソート済みの数値配列を第1引数、検索したい数値を第2引数として受け取るJavaScript関数の実装方法を解説します。検索対象の数値が配列内に存在する場合はそのインデックスを返し、存在しない場合は -1 を返します。この処理は二分探索(バイナリサーチ)アルゴリズムを用いて実装します。二分探索とは?二分探索は、典型的な分割統治法(Divide and Conquer)に分類されるアルゴリズムです。配列を半分ずつ再帰的(または反復的)に分割していき、探索範囲を絞り込みながら目的の要素へ収束させていきます。なお、二分探索を行うには配列が事前にソートされている必要があります。ソート済みであ
-
JavaScriptで2つ目の文字列が1つ目の文字列の回転かどうかを判定する方法
今回は、2つの文字列(str1 と str2)を受け取り、2つ目の文字列が1つ目の文字列を回転(ローテート)させたものかどうかを判定するJavaScript関数を作成します。問題の概要たとえば、入力として次のような文字列が与えられたとします。const str1 = abcde; const str2 = cdeab;この場合の出力は true になります。なぜなら、str2 は str1 の先頭にある「ab」を文字列の末尾に移動させることで作れるからです。つまり「abcde」を回転すると「cdeab」になるため、2つ目の文字列は1つ目の文字列の回転版であると言えます。実装の考え方判定は以下の
-
【JavaScript】同じキー値を持つオブジェクトをマージして出現回数をカウントする方法
データ処理を行っていると、「同じIDを持つ重複データを1つにまとめて、それぞれ何件ずつ存在するかを集計したい」というケースによく遭遇します。 この記事では、id プロパティの値が同じオブジェクトを1つにマージし、出現回数を count プロパティとして付与する方法を、reduce メソッドを使ったサンプルコードとともに解説します。 元となる配列 まず、次のようなオブジェクトの配列があると仮定しましょう。 const arr = [{ value: 10, id: 111, name: BlackCat, }, { value: 10, id: 111,
-
JavaScriptでJSON配列を日付(date)をキーにマージする方法
JavaScriptでデータを扱っていると、「同じ種類のデータが日付ごとに別々のオブジェクトとして格納されていて、1つにまとめたい」というケースによく遭遇します。たとえば、異なるソースから取得した価格データを時系列に整理したい場合などが典型です。 ここでは、次のようなオブジェクトの配列を例に、「date」プロパティをキーとして重複する日付のオブジェクトをマージする関数の作り方を解説します。 const arr = [ { date: 2010-01-01, price: 30 }, { date: 2010-02-01, price: 40 },
-
【JavaScript】複数のオブジェクトの同名プロパティの値を合計する方法
JavaScriptでは、複数のオブジェクトにまたがる同じキー(プロパティ)の値を1つにまとめて合計したいケースがあります。例えば、次のような2つのオブジェクトがあるとします。 const obj1 = { a:12, b:8, c:17 }; const obj2 = { a:2, b:4, c:1 }; ここで求められるのは、このようなオブジェクトを引数として受け取り、同一のプロパティ名を持つ値どうしを合計して1つのプロパティにまとめるJavaScript関数です。 処理後の出力オブジェクトは、次のようになります。 const output = { a:14, b:
-
JavaScriptでオブジェクトのdateプロパティに基づいて配列を並べ替える方法
はじめにJavaScriptでは、日付情報を持つオブジェクトの配列を、日付順に並べ替えたい場面がよくあります。たとえば、次のような date プロパティを持つオブジェクトの配列を考えてみましょう。const arr = [ {date: "2016-06-08 18:10:00"}, {date: "2016-04-26 20:01:00"}, {date: "2017-02-06 14:38:00&q
-
JavaScriptで部分列(サブシーケンス)を判定する方法|2つのポインタを使った効率的な実装
2つの文字列 str1 と str2 が与えられたとき、str1 が str2 の部分列であるかどうかを判定する関数を作成する方法を解説します。 部分列(サブシーケンス)とは? 文字列の部分列とは、元の文字列から一部の文字(0個でも構いません)を削除して作られる新しい文字列のことです。このとき、残った文字同士の相対的な順序は崩してはいけないというルールがあります。 例を挙げてみましょう。 "ace" は "abcde" の部分列です(b と d を削除すれば ace になります)。 "aec" は "abcde&qu
-
多次元配列と単一配列を受け取り、各サブ配列との共通要素を抽出するJavaScript関数の実装方法
本記事では、第1引数として「数値の配列を要素に持つ二次元配列」、第2引数として「数値の単一配列」を受け取るJavaScript関数の実装方法を解説します。この関数は、二次元配列内の各サブ配列について、第2引数の配列と共通する要素だけを抽出した新しいサブ配列を作成し、それらをまとめて返します。いわば、各サブ配列と単一配列の積集合(共通要素)を求める処理です。 入力例と期待される出力 たとえば、次のような入力を考えます。 const arr1 = [ [1, 2, 5, 6], [5, 13, 7, 8], [9, 11, 13, 15], [13, 14, 15, 16],
-
JavaScriptで連結成分を抽出する方法 ― 定義された辺から移動可能な数値のセットを見つける
はじめに:問題の概要 次のような入力配列と、そこから得たい出力配列を考えてみましょう。 const input = [0:3, 1:3, 4:5, 5:6, 6:8]; const output = [ [0, 1, 3], [4, 5, 6, 8] ]; ここでは、各数値をグラフの「ノード(頂点)」、ペア x:y をノードxとノードyをつなぐ「辺(エッジ)」とみなします。そのうえで、定義された辺をたどって互いに移動できる数値の集合を見つけることが求められます。 グラフ理論の用語で表現すると、これは連結成分を見つける問題です。たとえば上記の例では、4から0へはどの辺を使っても移動できな
-
JavaScriptで文字列内の母音だけを反転する方法
問題の概要文字列を引数として受け取り、その中に含まれる母音(a・e・i・o・u)だけを反転するJavaScript関数を作成する必要があります。子音やその他の文字は元の位置にそのまま残し、母音同士の位置のみを入れ替えるのがポイントです。入力と出力の例たとえば、次の文字列が入力された場合を考えてみましょう。const str = Hello;この文字列に含まれる母音は「e」と「o」です。この2つを入れ替えると、期待される出力は次のようになります。const output = Holle;実装コードこの問題は「両端ポインタ(two-pointer)方式」を使うことで効率的に解けます。文字列の左端と
-
【JavaScript】Math.sqrt()を使わずに非負整数の平方根を求める方法
今回は、非負整数を受け取り、その平方根を計算して返すJavaScript関数を作成する方法を解説します。ただし、Math.sqrt()は使用しません。また、結果が浮動小数点数になる場合は、小数点以下を切り捨てて整数として返すものとします。 問題の概要 例えば、入力が「15」の場合、正確な平方根(約3.872)を返す必要はありません。それより小さい最も近い整数である「3」を返せばよいことになります。 このような問題に対しては、二分探索(バイナリサーチ)アルゴリズムを活用することで、効率的に平方根へと収束させることができます。 実装コード 実際のコードは以下の通りです。 num){
-
JavaScriptで文字列から構築できる最長回文の長さを求める方法
問題の概要小文字または大文字のアルファベットのみで構成された文字列 s が与えられたとき、これらの文字を使って構築できる最も長い回文の長さを返す必要があります。なお、大文字と小文字は区別されるため、たとえば「Aa」は回文として扱われません。例入力文字列が次の場合を考えてみましょう。const str = abccccdd;このとき出力は 7 になります。これは、「dccaccd」という長さ7の回文をこれらの文字で構築できるためです。解決のアプローチ回文を構築するには、同じ文字がペア(2つ)で必要です。そこで、各文字の出現状況を追跡し、ペアが成立するたびに長さを2ずつ加算していきます。さらに、奇
-
JavaScriptで配列内の3番目に大きい数値を求める方法
問題の概要 数値が格納された配列を受け取り、その中から3番目に大きい数値を取り出して返すJavaScript関数を作成します。 ただし、関数の時間計算量はO(n)以内に収める必要があります。つまり、sort()などで配列を並べ替えることなく、たった1回のループ処理で目的の数値を見つけなければなりません。 解決アプローチ 最も効率的なのは、上位3つの値を保持する変数を用意し、配列を1周しながら順次更新していく手法です。具体的な手順は以下の通りです。 first(最大値)、second(2番目)、third(3番目)をすべて -Infinity で初期化します。 各要素がすでに保持している3つ
-
JavaScriptで指定された整数のビット順を反転する方法
本記事では、与えられた整数のビット(2進数の桁)の並び順を反転させるJavaScriptプログラムの実装方法を解説します。まず、具体的な動作イメージを確認しておきましょう。56 → 2進数で「111000」 ビットを反転すると → 7(2進数で「111」)続いて、もう一つの例です。234 → 2進数で「11101010」 ビットを反転すると → 87(2進数で「1010111」)実装の考え方この処理は、以下の手順で実現できます。toString(2) メソッドを使って、数値を2進数表記の文字列に変換するsplit() で文字列を1文字ずつの配列に分解し、reverse() で要素の順序を反転さ
-
JavaScriptで特定の要素を配列の末尾に移動する方法
問題の概要 本記事では、数値の配列を第一引数として、単一の数値を第二引数として受け取るJavaScript関数の作成方法を解説します。 この関数の役割は、配列の中から第二引数で指定された数値と一致するすべての要素を見つけ出し、それらを配列の末尾に移動させることです。それ以外の要素は元の相対的な順序を保ったまま先頭側にまとめられます。 入力例と期待される出力 たとえば、入力配列が以下の通りだったとしましょう。 const arr = [1, 5, 6, 6, 5, 3, 3]; ここで第二引数として 6 を指定すると、期待される出力は次のようになります。 const output = [1, 5
-
JavaScriptで完全数を判定する方法|効率的なアルゴリズムとコード例
完全数とは? 完全数(かんぜんすう)とは、その数自身を除く正の約数の総和が、元の数と等しくなる正の整数のことです。ここでいう約数とは、ある整数 x を余りなく割り切ることができる整数を指します。 例えば、28 は完全数です。 28 is a perfect number, because 28 = 1 + 2 + 4 + 7 + 14 1、2、4、7、14 はいずれも 28 を割り切ることができ、その合計がちょうど 28 になるためです。 この記事では、数値 n を受け取り、n が完全数であるかどうかを判定する JavaScript 関数を作成します。 実装のポイント:なぜ √n まで調べれば