JavaScriptで指定した数より大きい・小さい配列要素の個数を数える方法
問題の概要
次のような数値の配列があるとします。
const array = [3.1, 1, 2.2, 5.1, 6, 7.3, 2.1, 9];
ここで求めたいのは、指定した基準値よりも「小さい要素」と「大きい要素」がそれぞれ何個ずつ含まれているかを数える関数です。
具体例
たとえば基準値が 5.25 の場合、それより小さい要素は次の5つです。
(3.1, 1, 2.2, 5.1, 2.1)
逆に、基準値より大きい要素は次の3つになります。
(6, 7.3, 9)
注意: 要素の値が基準値とちょうど等しい場合は、「大きい側(以上)」としてカウントするルールとします。
実装コード
それでは、実際に関数を実装してみましょう。
const array = [3.1, 1, 2.2, 5.1, 6, 7.3, 2.1, 9];
const countNumbers = (arr, num) => {
return arr.reduce((acc, val) => {
const legend = ['upper', 'lower'];
const isBelow = val < num;
acc[legend[+isBelow]]++;
return acc;
}, {
lower: 0,
upper: 0
 });
};
console.log(countNumbers(array, 5.25));
console.log(countNumbers(array, 7));
console.log(countNumbers(array, 1));コードのポイント
この実装では Array.prototype.reduce() を活用し、配列を1回の走査だけで両方のカウントをまとめて取得しています。初期値として { lower: 0, upper: 0 } を持つオブジェクトを渡し、各要素ごとに val < num の判定結果をもとにカウント先を振り分けます。
特に注目すべきは const legend = ['upper', 'lower']; の部分です。真偽値 isBelow に単項プラス演算子(+)を適用すると、false は 0、true は 1 に変換されます。そのため、legend[+isBelow] によって「基準値未満なら 'lower'」「基準値以上なら 'upper'」というキーが自動的に選択され、条件分岐を書かずに簡潔に処理できるのが特徴です。
実行結果
コンソールには以下のように出力されます。
{ lower: 5, upper: 3 }
{ lower: 6, upper: 2 }
{ lower: 0, upper: 8 }- 5.25 を指定した場合: 小さい要素が5個、大きい要素が3個
- 7 を指定した場合: 小さい要素が6個、大きい(7を含む)要素が2個
- 1 を指定した場合: 小さい要素は0個で、すべての要素が「大きい側」に分類される
このように reduce() を使うことで、フィルタ処理を複数回行う必要がなく、効率的かつ読みやすいコードで実現できます。
-
JavaScriptで配列の要素を同じ配列内に複製する方法
JavaScriptでは、concat()メソッドとsort()メソッドを組み合わせることで、既存の配列の要素を同じ配列内に複製することができます。ここでは、実際に動作するサンプルコードを使って、その手順をわかりやすく解説します。 コード例 以下は、配列の要素を同じ配列内に複製するためのコード例です。 <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8" /> <meta name="viewport" cont
-
C++で配列要素と指定した数値の平均の出現回数をカウントする方法
問題の概要 整数要素を含む配列 arr[] と整数 num が与えられます。この問題の目標は、各要素 arr[i] と num の平均を求め、その平均値が元の配列 arr[] 内に何回出現するかをカウントして出力することです。 たとえば、配列 arr[] が [5, 2, 3]、num が 2 の場合、平均値は [3, 2, 2] となり、それぞれが arr[] 内に出現する回数は [1, 1, 1] になります。 入力例 1 arr[] = { 1, 6, 4, 3, 6, 4 }num = 2 出力例 1 1 2 1 0 2 1 ゼロ以外の出現回数を持つ要素の合計:5 説明 num