JavaScriptで配列の共通部分(交差)を求める最も簡単なコード
配列の交差(インターセクション)とは、複数の配列に共通して含まれる要素だけを取り出す操作のことです。JavaScriptでは、Setオブジェクトとfilterメソッドを組み合わせることで、わずか数行のコードで効率的に実装できます。
実装例
以下は、2つの配列から共通する要素を抽出するサンプルコードです。
<html>
<body>
<script>
let intersection = function(x, y) {
x = new Set(x), y = new Set(y);
return [...x].filter(k => y.has(k));
};
document.write(intersection([5,7,4,8], [3,9,8,4,3]));
</script>
</body>
</html>
実行結果
4,8
コードの解説
このコードが動作する仕組みを、処理の流れに沿って見ていきましょう。
1. 配列をSetに変換する
new Set(x) と new Set(y) により、両方の配列をSetオブジェクトに変換しています。Setは重複する値を持たないコレクションなので、この時点で各配列内の重複要素が自動的に取り除かれます。上記の例では、2つ目の配列に含まれる重複した「3」が1つにまとめられます。
2. Setを配列に戻す
スプレッド構文 [...x] を使うことで、Setを再び通常の配列に展開しています。これにより、後続のfilterメソッドが使えるようになります。
3. filterで共通要素を抽出する
filter(k => y.has(k)) により、配列xの各要素kが配列yのSet(y)に存在する場合のみ、その要素を結果として残します。y.has(k) はSetに対する高速な存在チェックを行うため、大きな配列でもパフォーマンスが良好です。
まとめ
このように、Setとfilterを組み合わせれば、ループ処理を書くことなく簡潔に配列の共通部分を求められます。コードも読みやすく、重複除去まで同時にできるのがポイントです。ES6以降の環境であればブラウザを問わず利用できるため、実務でも安心して使える手法といえるでしょう。
-
JavaScriptで合計が0になる部分配列が存在するかどうかを判定する方法
正と負の値が混在する数値の配列を受け取り、元の配列の中に合計が0になる部分配列(サブ配列)が存在するかどうかを判定するJavaScript関数を作成する必要があります。関数は、その判定結果に基づいてブール値(true または false)を返す必要があります。アプローチこの問題のアプローチはシンプルです。forループを使って配列を先頭から走査しながら、その要素までの累積和を計算していきます。走査の途中で累積和が0になった場合、あるいは以前に同じ値の累積和が出現した場合は、合計が0になる部分配列が存在することを意味します。逆に、配列の最後までそのような状況が一度も発生しなければ、合計が0になる部
-
JavaScriptで配列の共通要素(交差)を求める最も簡単な方法|filter()とincludes()の使い方
まず、次のような2つの配列があるとします。var firstNamesArray=[John,David,Bob,Sam,Carol]; var secondNamesArray=[Mike,Carol,Adam,David];filter() と includes() を組み合わせるのが最もシンプル配列の交差(両方の配列に存在する共通要素)を求める最も簡単な方法は、filter() メソッドと includes() メソッドを組み合わせて使うことです。filter() で一方の配列を走査し、その各要素がもう一方の配列に含まれているかどうかを includes() で判定します。コード例var