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

JavaScriptで配列内の重複要素を1つにまとめて合計する方法

この記事では、重複した値を含む数値の配列を受け取り、同じ値が複数回出現した場合はそれらを1つのインデックスに合計して返すJavaScript関数を作成します。

例えば、次のような入力配列があるとします。

const input = [1, 3, 1, 3, 5, 7, 5, 4];

期待される出力

const output = [2, 6, 10, 7, 4];

それぞれの値は以下のように計算されます。

  • 「1」は2回出現するため → 1 × 2 = 2
  • 「3」は2回出現するため → 3 × 2 = 6
  • 「5」は2回出現するため → 5 × 2 = 10
  • 「7」と「4」は1回しか出現しないため、元の値のまま → 7, 4

実装コード

それでは、この関数のコードを見ていきましょう。

const input = [1, 3, 1, 3, 5, 7, 5, 4];
const mergeDuplicates = arr => {
    const map = arr.reduce((acc, val) => {
        if(acc.has(val)){
            acc.set(val, acc.get(val) + 1);
        }else{
            acc.set(val, 1);
        };
        return acc;
    }, new Map());
    return Array.from(map, el => el[0] * el[1]);
};
console.log(mergeDuplicates(input));

コードの解説

まず、reduce() メソッドを使用して、各要素の出現回数を記録した Map オブジェクトを構築しています。Map のキーには配列内の値が、バリューにはその出現回数が格納されます。すでに存在するキーが出現した場合はカウントを1つずつ増やしていきます。

次に、Array.from() を使って Map を配列へ変換し、各エントリ(キーと値のペア)に対して「値 × 出現回数」を計算することで、重複を合計した新しい配列を生成しています。

実行結果

コンソールに出力される結果は以下の通りです。

[ 2, 6, 10, 7, 4 ]

補足: Map は挿入された順序を保持するため、出力配列は元の配列で各値が最初に現れた順番になります。また、このアプローチは配列を一度だけ走査すればよいため、時間計算量は O(n) となり、大規模な配列でも効率的に動作します。

  1. JavaScriptで範囲内のすべての数値の合計を求める方法

    問題範囲を指定する配列を受け取るJavaScript関数を作成する必要があります。この関数は、指定された範囲に含まれるすべての自然数(両端の数値も含む)の合計を計算し、その結果を返すものとします。解決策:ループを使った実装以下のコードでは、forループを使って下限値から上限値まで順番に足し合わせていく、シンプルな実装例を示します。const range = [4, 67];const findSum = ([l, h]) => {    let sum = 0;    for(let i = l; i <

  2. JavaScriptで3つの配列に共通する要素の合計を求める方法

    問題今回は、3つの数値型配列を引数として受け取るJavaScript関数を作成します。この関数は、3つの配列すべてに共通して存在する要素だけを抜き出し、それらの合計値を返す必要があります。たとえば、次のような配列が与えられた場合を考えてみましょう。const arr1 = [4, 4, 5, 8, 3]; const arr2 = [7, 3, 7, 4, 1]; const arr3 = [11, 0, 7, 3, 4];この場合、3つの配列すべてに存在するのは「4」と「3」なので、期待される出力は 4 + 3 = 7 となります。解決策のコード例以下がその実装コードです。 { le