JavaScriptで文字列に含まれる「輪」の数を数える方法
問題
英語のアルファベットからなる文字列を受け取り、その中に含まれる「輪(リング)」の総数を数えるJavaScript関数を作成する必要があります。
ここでいう「輪」とは、各文字がもつ閉じたループ(穴)のことを指します。たとえば、「A」「D」「O」「P」「Q」「R」「a」「b」「d」「e」「g」「o」「p」「q」などの文字は輪を1つ持ち、「B」は輪を2つ持ちます。一方、「L」「T」「F」「s」などの文字には輪が存在しません。
解決のアプローチ
この問題は、以下の手順で解くことができます。
- 輪を1つ持つ文字のリストと、輪を2つ持つ文字のリストをあらかじめ定義しておきます。
- 対象の文字列を1文字ずつに分解します。
- 各文字がどちらのリストに該当するかを判定し、対応する数だけスコアを加算します。
- 最終的なスコアを結果として返します。
コード例
const str = 'some random text string';
function countRings(str){
const rings = ['A', 'D', 'O', 'P', 'Q', 'R', 'a', 'b', 'd', 'e', 'g', 'o', 'p', 'q'];
const twoRings = ['B'];
let score = 0;
str.split('').map(x => rings.includes(x)
? score++
: twoRings.includes(x)
? score = score + 2
: x
);
return score;
}
console.log(countRings(str));
出力結果
7
コードの解説
countRings 関数は、引数として受け取った文字列に対して以下の処理を行います。
- split('') メソッドで文字列を1文字ずつの配列に分解します。
- 各文字をチェックし、rings 配列に含まれていれば score を1加算、twoRings 配列に含まれていれば score を2加算します。
- 条件分岐には三項演算子を使用しています。
- すべての文字を処理し終えたら、合計値である score を返します。
例として挙げた文字列「some random text string」の場合、o・e・a・d・o・e・g の7文字がそれぞれ輪を1つ持つため、合計は 7 となります。
なお、このコードでは副作用のためだけに map を使用していますが、戻り値が不要な場合は forEach を使うほうが意図が明確になり、より読みやすいコードになります。
-
JavaScriptのオブジェクト配列に配列メソッドを適用する方法
JavaScriptでは、オブジェクトが格納された配列に対しても、通常の配列と同じようにpop()、push()、splice()などの標準的な配列メソッドをそのまま使用できます。オブジェクト配列はあくまで「配列」であるため、要素としてオブジェクトが入っていても配列操作のAPIは共通で動作します。 コード例 以下は、JavaScriptオブジェクトの配列に対して配列メソッドを使用するサンプルコードです。 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8
-
JavaScriptのクロージャでプライバシー(変数の隠蔽)を実現する方法
はじめに:クロージャとは何かJavaScriptにはクラスベース言語のような「private」修飾子が存在しないため、変数を外部から直接アクセスできないようにしたい場合、クロージャ(Closure)を活用するのが定番のテクニックです。クロージャとは、「関数が定義されたときのスコープ(外側の変数)への参照を保持し続ける仕組み」のことです。この性質を利用すると、関数の内部に閉じ込めた変数は外部から直接参照・書き換えできなくなり、いわばプライベートな状態として扱うことができます。以下に、クロージャを使ってプライバシー(変数の隠蔽)を実現するサンプルコードを示します。サンプルコード<!DOCTY