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

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段階の処理を行っています。

  1. 出現回数のカウント: reduce()メソッドを使い、配列内の各値が何回出現したかをMapオブジェクトに記録します。マップのキーには配列の値そのものを、バリューには出現回数を格納します。初めて登場した値は回数「1」として登録し、以降は既存の回数に1を加えていきます。
  2. 合計値の算出: Array.from()を使ってマップを配列に変換しながら、「元の値 × 出現回数」を計算します。これにより、重複していた値は合計された形になり、1度しか出現しなかった値はそのまま残ります。

たとえばサンプルの入力配列では「3」が3回出現しているため、3 × 3 = 9 として出力されます。同様に「5」は2回出現するので 5 × 2 = 10 となり、「7」と「4」はそれぞれ1回のみのため元の値のまま出力されます。


  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

  2. JavaScriptで配列の要素をすべて奇数に変換する方法

    問題 配列を受け取り、その各要素を次のルールに従って変換するJavaScript関数を作成することを考えます。 数値が奇数の場合 → そのままの値を保持する 数値が偶数の場合 → 1を引いて奇数に変換する そして最後に、変換後の新しい配列を返します。 コード例 以下が実際のコードです。 const arr = [5, 23, 6, 3, 66, 12, 8]; const reduceToOdd = (arr = []) => {     const res = [];     for(let i =