【JavaScript】配列から重複している値だけを抽出して1回ずつ表示する方法
問題の概要
JavaScriptでは、重複した値を含む配列から「複数回出現している要素だけ」を取り出し、それぞれ1回ずつ表示したいケースがあります。
例えば、次のような数値の配列を考えてみましょう。
const arr = [1, 4, 3, 3, 1, 3, 2, 4, 2, 1, 4, 4];
この配列には、1・4・3・2がそれぞれ複数回出現しています。そこで、重複している値のみを抽出し、結果として1回ずつ返す関数を作成します。
上記の配列に対する期待される出力は次のとおりです。
const output = [1, 4, 3, 2];
実装例
以下のコードでは、indexOf() と lastIndexOf() の結果を比較することで、その値が配列内で重複しているかどうかを判定しています。さらに includes() を併用することで、結果配列に同じ値が何度も追加されるのを防いでいます。
const arr = [1, 4, 3, 3, 1, 3, 2, 4, 2, 1, 4, 4];
const removeDuplicate = arr => {
const res = [];
for(let i = 0; i < arr.length; i++){
if(arr.indexOf(arr[i]) !== arr.lastIndexOf(arr[i])){
if(!res.includes(arr[i])){
res.push(arr[i]);
};
};
};
return res;
};
console.log(removeDuplicate(arr));コードの解説
この関数の仕組みは以下のとおりです。
- indexOf() と lastIndexOf() の比較: ある値が最初に出現する位置と最後に出現する位置が異なる場合、その値は配列内に複数存在する(= 重複している)ことを意味します。
- includes() による重複チェック: すでに結果配列
resに追加済みの値は、二度とpushされないよう制御しています。
実行結果
コンソールには次のように出力されます。
[1, 4, 3, 2]
補足:Set を使ったより簡潔な書き方
モダンなJavaScriptでは、filter() と Set を組み合わせることで、同じ処理をより短く記述できます。
const arr = [1, 4, 3, 3, 1, 3, 2, 4, 2, 1, 4, 4]; const duplicated = [...new Set(arr.filter(v => arr.indexOf(v) !== arr.lastIndexOf(v)))]; console.log(duplicated); // [1, 4, 3, 2]
filter() で重複している要素だけを残し、new Set() によって一意な値に絞り込んでいます。スプレッド構文(...)を使えば、Setを簡単に配列へ戻すことも可能です。可読性とパフォーマンスの観点から、こちらの書き方を推奨する場面も多くなっています。
-
SeleniumでJavaScriptコードの戻り値を取得する方法
Selenium WebDriverを使用すると、JavaScriptコードの戻り値を取得することができます。SeleniumはexecuteScriptメソッドを利用してJavaScriptコマンドを実行でき、実行したいJavaScriptコマンドはこのメソッドの引数として渡します。 JavaScriptコードから値を返す際にはreturnキーワードを使用します。また、JavaScriptを操作するためには、import org.openqa.selenium.JavascriptExecutorというインポート文を追加する必要がある点にも注意してください。 構文 JavascriptEx
-
JavaScriptで昇順配列の中から並び順を壊している唯一の要素を見つける方法
この記事では、昇順(増加順)にソートされた数値の配列の中に、ただひとつだけ並び順を乱している要素がある場合に、その要素を特定して返すJavaScript関数の実装方法を解説します。 問題の定義 扱う配列は基本的に昇順でソートされていますが、その中の要素がひとつだけ順序から外れています。関数の目的は、その「異常な要素」を見つけ出して返すことです。 たとえば、次のような配列を考えます。 const arr = [1, 2, 3, 4, 17, 5, 6, 7, 8]; この配列から「17」を取り除けば残りは完全な昇順になるため、求める答えは「17」です。 解決のアプローチ 昇順の配列では、隣り合う