【JavaScript】配列から重複する値だけを1回ずつ抽出する方法
JavaScriptでは、同じ値が何度も出現する配列を扱うことがよくあります。たとえば、次のような配列には、複数回登場する重複値が含まれています。
const arr = [1, 4, 3, 3, 1, 3, 2, 4, 2, 1, 4, 4];
ここで求められるのは、この配列を受け取って、元の配列の中で「重複している値」だけを取り出し、それぞれ1回だけ出力するJavaScript関数を作成することです。
上記の配列の場合、期待される出力は次のとおりです。
const output = [1, 4, 3, 2];
実装例
それでは、この関数のコードを見ていきましょう。ポイントは、indexOf()とlastIndexOf()を組み合わせて「その値が配列内で複数回出現しているか」を判定し、さらにincludes()で結果への追加済みチェックを行うことです。
const arr = [1, 4, 3, 3, 1, 3, 2, 4, 2, 1, 4, 4];
const pickDuplicate = 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(pickDuplicate(arr));コードの解説
- indexOf() と lastIndexOf() の比較: ある要素が最初に出現する位置(indexOf)と最後に出現する位置(lastIndexOf)が異なる場合、その値は2回以上登場している=重複していると判断できます。
- includes() による重複チェック: 結果用の配列
resに同じ値がすでに存在する場合は push を行わないことで、各重複値を1回だけ抽出しています。
出力結果
コンソールへの出力は次のようになります。
[1, 4, 3, 2]
補足:Set を使った別のアプローチ
ES6以降では、filter()とSetを組み合わせることで、より簡潔に記述することも可能です。
const pickDuplicate = arr => {
return [...new Set(arr.filter((v, i) => arr.indexOf(v) !== arr.lastIndexOf(v)))];
};
console.log(pickDuplicate(arr)); // [1, 4, 3, 2]この手法を使えば、重複している値だけを短いコードで効率的に抽出できます。データのクレンジングや集計処理などで役立つテクニックなので、ぜひ覚えておきましょう。
-
JavaScriptで24時間表記を12時間表記(午前・午後)に変換する方法
JavaScriptで24時間表記を12時間表記(午前・午後)に変換する方法 Webアプリケーションを開発していると、24時間表記の時刻を「午前・午後」が付いた12時間表記に変換して表示したい場面があります。この記事では、JavaScriptとHTMLを組み合わせて、ユーザーが入力した時刻を12時間表記に変換し、その結果を画面に表示するシンプルなプログラムを紹介します。 コード例 <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8" />
-
JavaScriptで文字列内の2つ以上の連続スペースを1つのスペースに変換する方法
概要 HTMLの入力欄からユーザーが入力した文字列をJavaScriptで受け取り、その中に含まれる「2つ以上の連続した空白」を検出し、すべて1つのスペースに置き換えるプログラムを作成します。このような処理には正規表現を使うのが最もシンプルで確実な方法です。replace()メソッドの第1引数に正規表現 /\s{2}/g を指定することで、目的の結果を簡単に得られます。 使用する正規表現のポイント \s:半角スペース・タブ・改行などの空白文字にマッチします。 {2}:直前のパターンが2回以上連続する場合にマッチします。 g(グローバルフラグ):文字列内のすべての該当箇所を置換対象にします。