【JavaScript】配列内の要素が指定した回数以上繰り返されていないか検証する方法
はじめに
この記事では、配列内の各要素が指定された上限回数を超えて繰り返されていないかどうかを検証するJavaScript関数の実装方法を解説します。
作成する関数は、次の2つの引数を受け取ります。
- 配列(arr):リテラル値を含み、一部の要素が重複している可能性がある配列
- 数値(limit):要素が許容される最大の繰り返し回数
関数は、配列内のどの要素もlimitで指定された回数より多く繰り返されていないことを確認する必要があります。もし1つでも要素がlimitを超えて繰り返されている場合は false を返し、すべての要素が条件を満たしていれば true を返します。
実装の考え方
この問題を解くには、以下の手順で処理を行います。
- 出現回数の集計:
reduce()メソッドを使って、配列を走査しながら各要素の出現回数をオブジェクトに記録します。 - 条件の判定:
Object.values()で集計結果の値(出現回数)を配列として取得し、every()メソッドですべての回数がlimit未満であるかどうかをチェックします。
every() は、配列内のすべての要素が条件を満たす場合にのみ true を返すため、この種のバリデーションに最適なメソッドです。
コード例
以下が実際のコードです。
const arr = [4, 6, 7, 4, 2, 5, 7, 7, 4, 4, 3];
const validateElements = (arr, n) => {
// 各要素の出現回数を集計する
const counts = arr.reduce((acc, el) => {
acc[el] = (acc[el] + 1) || 1;
return acc;
}, {});
// すべての要素の出現回数が n 未満かどうかを判定する
return Object.values(counts).every(c => {
return c < n;
});
};
console.log(validateElements(arr, 3));
console.log(validateElements(arr, 4));
console.log(validateElements(arr, 6));実行結果
上記のコードをコンソールで実行すると、次のような出力が得られます。
false false true
出力の解説
サンプル配列 [4, 6, 7, 4, 2, 5, 7, 7, 4, 4, 3] の各要素の出現回数を整理すると、以下のようになっています。
4→ 4回6→ 1回7→ 3回2→ 1回5→ 1回3→ 1回
このうち 4 が4回出現しているため、limit が 3 の場合は false、limit が 4 の場合も「4 < 4」が成り立たないため false となり、limit が 6 の場合はすべての要素が6未満の回数しか出現していないため true が返されます。
まとめ
このように、reduce() による出現回数の集計と Object.values().every() による一括判定を組み合わせることで、シンプルかつ効率的に配列内の重複回数を検証できます。計算量は配列の長さを n とすると O(n) で済むため、大きな配列に対しても高速に動作する点がメリットです。
-
JavaScript配列で要素を検索する方法を徹底解説!find()メソッドの使い方
JavaScriptで配列の中から特定の要素を検索したい場面は非常に多くあります。本記事では、最もよく使われるfind()メソッドを中心に、実際に動作するサンプルコードとともに分かりやすく解説します。 find()メソッドとは find()メソッドは、配列の各要素に対して指定したテスト関数(コールバック関数)を実行し、条件を満たした最初の要素の値を返します。条件に一致する要素が存在しない場合は undefined を返します。 基本構文 arr.find(callback(element[, index[, array]])[, thisArg]) callback: 各要素をテストする関数
-
JavaScript配列から一意の値(重複なし)を取得する方法
JavaScriptの配列に含まれる重複した値を取り除き、一意の値(ユニークな値)だけを取得したい場合は、Setオブジェクトを使うのが最もシンプルで効率的な方法です。 Setは同じ値を1つしか格納できないデータ構造のため、配列をnew Set()に渡すだけで自動的に重複が排除されます。その後、スプレッド構文([...set])を使えば、簡単に元の配列形式へ戻すことができます。 サンプルコード 以下は、JavaScriptの配列からすべての一意の値を取得する実際のコード例です。 <!DOCTYPE html> <html lang=ja> <head> <