JavaScriptで配列からn回以上出現する要素をすべて抽出する方法
数値や文字列のリテラルが含まれる配列があり、その中には重複した要素も存在します。ここでの課題は、正の整数 n を唯一の引数として受け取り、その引数で指定された回数 n 回以上 出現するすべての要素からなる部分配列を返す関数を作成することです。
たとえば「3回以上出現している要素だけを取り出したい」といったケースを想定しています。それでは、この関数を実装していきましょう。
アプローチ:Map()で出現回数を管理する
各要素の出現頻度を記録するために Map() を使用します。配列を走査しながら出現回数をカウントし、指定された回数に達した時点でその要素を結果配列に追加することで、同じ要素が結果に重複して含まれてしまうのを防ぎます。コードは以下の通りです。
サンプルコード
const arr = [34, 6, 34, 8, 54, 7, 87, 23, 34, 6, 21, 6, 23, 4, 23];
const moreThan = (arr, num) => {
const creds = arr.reduce((acc, val) => {
let { map, res } = acc;
const count = map.get(val);
if(!count && typeof count !== 'number'){
map.set(val, 1);
}else if(num - count <= 1){
res.push(val);
} else {
map.set(val, count+1);
};
return {map, res};
}, {
map: new Map(),
res: []
});
return creds.res;
};
console.log(moreThan(arr, 3));
コードの解説
reduce()を使い、アキュムレータとしてmap(出現回数を記録するMap)とres(結果配列)を持つオブジェクトを受け渡します。map.get(val)の戻り値が数値でない場合、その要素は初めて登場したものなので、カウントを1に設定します。num - count <= 1が成り立つとき、つまり出現回数が指定回数に達した瞬間に、その要素をresに一度だけ追加します。- それ以外の場合は、カウントを
+1して処理を続行します。
出力結果
コンソールには以下のように表示されます。
[34, 6, 23]
この例では、34・6・23 の3つの要素がそれぞれちょうど3回出現しているため、これらだけが結果として返されています。条件の閾値となる num の値を変えれば、任意の出現回数以上の要素を柔軟に抽出できます。
-
【JavaScript】_.where()メソッドで特定の条件に一致するすべての要素を取得する方法
JavaScriptには数多くのフレームワークやユーティリティライブラリが存在しますが、その中でもunderscore.jsは軽量かつ高機能なライブラリとして広く使われています。underscore.jsが提供する便利な関数のひとつが_.where()で、これを使うと配列の中から特定の条件に一致する要素を簡単に見つけ出すことができます。 _.where()は、指定された条件を配列内の各要素が満たしているかどうかを順番に判定し、条件を満たした要素だけを新しい配列として返すメソッドです。たとえば「配列の中から給与が15000と等しい人をすべて探したい」という場合、_.where()は全要素を精査し
-
複数の値でJavaScript配列の要素を検索する方法
JavaScriptである配列(arr)が、別の配列(arr1)の複数の値・すべての要素を含んでいるかどうかを確認したい場面はよくあります。そんなときは、every()メソッドとincludes()メソッドを組み合わせることで、シンプルに判定できます。以下はそのサンプルコードです。 コード例 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content=