JavaScriptで配列内の重複する値を合計して1つの要素にまとめる方法
問題の概要
数値が格納された配列(重複する要素を含む)を受け取り、重複している値をすべて合計して、同じ値ごとに1つの要素へまとめるJavaScript関数を作成します。
例として、次のような入力配列が与えられたとします。
const input = [1, 3, 1, 3, 5, 7, 5, 4];
この場合、期待される出力は次のとおりです。
const output = [2, 6, 7, 10, 4];
「1」「3」「5」はそれぞれ2回ずつ出現しているため、合計されて「2」「6」「10」となり、重複のない「7」と「4」はそのままの値で残ります。
サンプルコード
それでは、実際のコードを見ていきましょう。
const input = [1, 3, 1, 3, 5, 7, 5, 3, 4];
const sumDuplicate = arr => {
// 各値の出現回数をMapに記録する
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, ([key, value]) => key * value);
};
console.log(sumDuplicate(input));
実行結果
コンソールには次のように出力されます。
[ 2, 9, 10, 7, 4 ]
コードの解説
このコードは、大きく分けて2段階の処理を行っています。
- 出現回数のカウント:
reduce()メソッドを使い、配列内の各値が何回出現したかをMapオブジェクトに記録します。マップのキーには配列の値そのものを、バリューには出現回数を格納します。初めて登場した値は回数「1」として登録し、以降は既存の回数に1を加えていきます。 - 合計値の算出:
Array.from()を使ってマップを配列に変換しながら、「元の値 × 出現回数」を計算します。これにより、重複していた値は合計された形になり、1度しか出現しなかった値はそのまま残ります。
たとえばサンプルの入力配列では「3」が3回出現しているため、3 × 3 = 9 として出力されます。同様に「5」は2回出現するので 5 × 2 = 10 となり、「7」と「4」はそれぞれ1回のみのため元の値のまま出力されます。
-
JavaScriptで配列内の正の数だけを合計する方法
問題正と負の数値が混在した配列を受け取り、その中に含まれる正の数すべての合計を計算して返すJavaScript関数を作成する必要があります。たとえば、[5, -5, -3, -5, -7, -8, 1, 9] という配列が与えられた場合、正の数は 5、1、9 の3つなので、期待される出力は 15 となります。解決コード以下がその実装例です。const arr = [5, -5, -3, -5, -7, -8, 1, 9]; const sumPositives = (arr = []) => { const isPositive = num => type
-
JavaScriptで配列の要素をすべて奇数に変換する方法
問題 配列を受け取り、その各要素を次のルールに従って変換するJavaScript関数を作成することを考えます。 数値が奇数の場合 → そのままの値を保持する 数値が偶数の場合 → 1を引いて奇数に変換する そして最後に、変換後の新しい配列を返します。 コード例 以下が実際のコードです。 const arr = [5, 23, 6, 3, 66, 12, 8]; const reduceToOdd = (arr = []) => { const res = []; for(let i =