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