JavaScriptで配列内の重複回数が最も少ない要素を検索する方法
問題の概要
重複した値を含む可能性のあるリテラル値の配列を受け取り、その中から出現回数が最も少ない要素をすべて配列として返すJavaScript関数を作成することを考えてみましょう。
例えば、入力配列が次のようになっているとします。
const arr = [1, 1, 2, 2, 3, 3, 3];
この場合、期待される出力は以下の通りです。
const output = [1, 2];
これは、1 と 2 の出現回数が最も少なく(それぞれ2回)、一方 3 は3回出現しているためです。つまり、最小の出現回数を持つ要素をすべて抽出する必要があります。
解決のアプローチ
この問題は、ハッシュ(連想配列)オブジェクトを活用することで効率的に解決できます。手順は以下の通りです。
- 各要素の出現回数を記録するためのハッシュオブジェクトを用意する。
- 配列を走査しながら、各要素の値と出現回数をカウントアップしていく。
- キーを出現回数の昇順にソートし、最小の出現回数を求める。
- 最小の出現回数と一致するキーだけをフィルタリングし、対応する元の値を返す。
なお、ここでは Object.create(null) を使ってプロトタイプを持たないオブジェクトを生成しています。これにより、constructor などの組み込みプロパティ名との衝突を回避でき、より安全にハッシュとして利用できます。
実装例
上記のロジックを実際のコードにすると、次のようになります。
const arr = [1, 1, 2, 2, 3, 3, 3];
const getLeastDuplicateItems = (arr = []) => {
const hash = Object.create(null);
let keys, min;
// 各要素の出現回数をハッシュに記録
arr.forEach(el => {
hash[el] = hash[el] || {
value: el,
count: 0
};
hash[el].count++;
});
// キーを出現回数の昇順にソート
keys = Object.keys(hash);
keys.sort(function (el, b) {
return hash[el].count - hash[b].count;
});
// 最小の出現回数を取得
min = hash[keys[0]].count;
// 最小回数と一致する要素の値だけを返す
return keys
.filter(el => {
return hash[el].count === min;
})
.map(el => {
return hash[el].value;
});
}
console.log(getLeastDuplicateItems(arr));出力結果
このコードを実行すると、コンソールには次のように表示されます。
[ 1, 2 ]
このように、ハッシュオブジェクトで出現回数を集計し、最小回数に該当する要素をフィルタリングするだけで、配列の中から最も重複の少ないアイテムを簡単に抽出することができます。
-
JavaScriptのArray.prototype.find()メソッドとは?使い方をサンプルコードで解説
Array.prototype.find() メソッドは、配列の中から指定した条件(テスト関数)を満たす最初の要素の値を返します。 条件に一致する要素が見つかった時点で検索を終了するため、大きな配列でも効率的に動作します。また、どの要素も条件を満たさなかった場合は undefined を返すという点も重要な特徴です。 find()メソッドの基本構文 arr.find(callback(element[, index[, array]])[, thisArg]) callback:各要素に対して実行されるテスト関数。true を返した要素が結果となります。 thisArg(省略可):callb
-
JavaScriptで配列の要素を同じ配列内に複製する方法
JavaScriptでは、concat()メソッドとsort()メソッドを組み合わせることで、既存の配列の要素を同じ配列内に複製することができます。ここでは、実際に動作するサンプルコードを使って、その手順をわかりやすく解説します。 コード例 以下は、配列の要素を同じ配列内に複製するためのコード例です。 <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8" /> <meta name="viewport" cont