JavaScriptで文字列内の各数字の出現回数をオブジェクトとして集計する方法
問題の概要
次のような、数字だけで構成された長い文字列があると仮定します。
const str = '11222233344444445666';
ここで求められているのは、このような文字列を受け取るJavaScript関数を作成することです。この関数は、文字列中に出現するそれぞれの一意な数字に対して、固有の「id」プロパティと、その数字が文字列内に何回出現したかを記録する「displayed」プロパティを持つオブジェクトを割り当てた結果を返す必要があります。
期待される出力
上記の文字列の場合、出力は次のようになります。
const output = {
'1': { id: '1', displayed: 2 },
'2': { id: '2', displayed: 4 },
'3': { id: '3', displayed: 3 },
'4': { id: '4', displayed: 7 },
'5': { id: '5', displayed: 1 },
'6': { id: '6', displayed: 3 }
};実装例
実際のコードは以下の通りです。
const str = '11222233344444445666';
const countNumberFrequency = str => {
const map = {};
for(let i = 0; i < str.length; i++){
const el = str[i];
if(map.hasOwnProperty(el)){
map[el]['displayed']++;
}else{
map[el] = {
id: el,
displayed: 1
};
};
};
return map;
};
console.log(countNumberFrequency(str));コードの解説
- まず、集計結果を格納するための空のオブジェクト map を用意します。
- forループで文字列を先頭から1文字ずつ走査し、現在の文字を変数 el に代入します。
- hasOwnProperty() メソッドを使って、その数字がすでにmapに登録されているかどうかを判定します。登録済みであれば対応する displayed の値を1つ増やし、未登録であれば id と displayed を持つ新しいエントリを作成します。
- ループが完了した時点で、すべての数字の出現回数が記録されたmapを返します。
このアルゴリズムの計算量は O(n) であり、処理時間は文字列の長さに比例して増加します。そのため、非常に長い文字列でも効率的に動作するのが特徴です。
出力
コンソールには以下のように表示されます。
{
'1': { id: '1', displayed: 2 },
'2': { id: '2', displayed: 4 },
'3': { id: '3', displayed: 3 },
'4': { id: '4', displayed: 7 },
'5': { id: '5', displayed: 1 },
'6': { id: '6', displayed: 3 }
}
-
Firebugを使ったJavaScriptデバッグ徹底ガイド|基本機能から実践手順まで
デバッグとは何か デバッグとは、ソフトウェアから欠陥(バグ)を体系的に取り除くプロセスのことです。作業はテストケースの実行から始まります。テストケースを実行すると、実際の結果と期待される結果が比較され、両者に不一致があれば根本原因の分析が行われます。さらに、リグレッションテストなどの追加テストを実施することで、結果が期待どおりのラインに沿っていることを確認します。 静的なWebページの作成にはHTMLが広く使われています。一方、動的なWebアプリケーションを開発するには、Webのスクリプト言語であるJavaScriptが欠かせません。コードをバグのない状態に保つため、プログラマーはさまざまなデ
-
JavaScriptのimportで波括弧「{}」を使う理由とは?名前付きエクスポートの基本をわかりやすく解説
JavaScript(ESモジュール)でモジュールを読み込む際、import 文に波括弧 { } を付けるかどうか迷ったことはありませんか?実はこの波括弧は、名前付きエクスポート(named export)を読み込むために必要な記法です。本記事では、実際のコード例を使いながら、{ } の役割と使い方を詳しく解説します。 importで { } を使う場面とは JavaScriptのESモジュールでは、エクスポート方法によって読み込み側の書き方が変わります。 名前付きエクスポート:export { 関数名 } のようにエクスポートされたものを読み込む場合は、import { 名前 } fro