JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

JavaScriptで3回以上繰り返される要素を配列から削除する方法

問題の概要

リテラル値(数値や文字列など)が格納された配列を引数として受け取り、3個ずつまとめて削除できる要素(トリプレット)をすべて取り除いた新しい配列を返すJavaScript関数を作成してみましょう。

たとえば、同じ値が3回含まれていればそれらはすべて削除され、4回含まれていれば1つだけ残ります。6回含まれていればすべて削除されます。つまり、各要素の出現回数を3で割った余りの分だけ要素を残すというのがポイントです。

実装コード

以下がその実装例です。

const arr1 = [1,1,1,3,3,5];
const arr2 = [1,1,1,1,3,3,5];
const arr3 = [1,1,1,3,3,3];
const arr4 = [1,1,1,1,3,3,3,5,5,5,5,5,5,5,5,5,5,5,5,7,7];

const removeTriplets = arr => {
    const hashMap = arr => arr.reduce((acc, val) => {
        if(val in acc){
            acc[val]++;
        }else{
            acc[val] = 1;
        };
        return acc;
    }, {});
    let res = [];
    let obj = hashMap(arr);
    for(let key in obj){
        for(let i = 0; i < obj[key] % 3; i++){
            res.push(Number(key));
        };
    }
    return res;
}

console.log(removeTriplets(arr1));
console.log(removeTriplets(arr2));
console.log(removeTriplets(arr3));
console.log(removeTriplets(arr4));

コードの解説

この関数は次の手順で動作します。

  1. 出現回数の集計reduceメソッドを使い、配列内の各値の出現回数をオブジェクト(ハッシュマップ)に集計します。
  2. 余りの計算: 各キーに対して出現回数を3で割った余り(% 3)を求め、その回数だけ結果配列へ要素を追加します。
  3. 結果の返却: トリプレットとして削除できる分を除いた残りの要素からなる新しい配列を返します。

なお、for...inでオブジェクトのキーを取得すると文字列になるため、元のコードでは文字列として結果に格納されてしまいます。上記のコードではNumber(key)で数値に変換して戻しています。

実行結果

コンソールへの出力は以下のようになります。

[ 3, 3, 5 ]
[ 1, 3, 3, 5 ]
[]
[ 1, 7, 7 ]

まとめ

このアプローチを使えば、配列内で3回以上繰り返し出現する要素を効率的にフィルタリングできます。計算量はO(n)で済むため、大きな配列でも高速に処理できるのが特徴です。

  1. JavaScriptの配列を文字列に変換する方法【toString()の使い方を解説】

    JavaScriptで配列の要素をひとつの文字列として扱いたい場面はよくあります。そんなときに便利なのがtoString()メソッドです。このメソッドを使うと、配列の各要素がカンマ(,)で区切られたひとつの文字列に変換されます。以下は、ボタンをクリックすると配列の中身が文字列として画面に表示されるシンプルなサンプルコードです。サンプルコード<!DOCTYPE html> <html lang=ja> <head> <meta charset=UTF-8 /> <meta name=viewport content=width=device-

  2. JavaScriptのカスタム関数で配列から重複要素をすべて削除する方法

    概要 リテラル値の配列を受け取るJavaScript関数を作成する必要があります。ある要素が配列内に2回以上出現している場合、その要素のすべての出現箇所を配列から削除しなければなりません。 たとえば、入力配列が次のような場合—— const arr = [1,2,3,4,4,5,5]; 期待される出力は次のとおりです。 const output = [1, 2, 3]; このように、単に重複を1つ残すのではなく、重複している要素自体を配列から完全に取り除く点がポイントです。 実装例 以下のコードでは、指定した値を配列からすべて削除する補助関数 removeAll を用意し、各要素について in