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

JavaScriptで配列内の重複しない要素の合計を求める方法

本記事では、数値の配列を受け取り、そこに含まれる一意な(重複しない)値ごとに1回だけ加算した合計を求めるJavaScript関数の実装方法を解説します。同じ値が何度出現しても、合計には1回しか含まれない点がポイントです。

問題の例

たとえば、次のような数値の配列があるとします。

const arr = [1, 5, 2, 1, 2, 3, 4, 5, 7, 8, 7, 1];

この配列に含まれる異なる値は 1, 5, 2, 3, 4, 7, 8 の7種類です。したがって、この関数が返すべき出力は次のとおりです。

1 + 5 + 2 + 3 + 4 + 7 + 8 = 30

実装例:lastIndexOf を使った方法

各要素について、「現在のインデックスがその値が最後に現れる位置と一致しているか」を判定すると、重複する値を1回だけ加算できます。

const arr = [1, 5, 2, 1, 2, 3, 4, 5, 7, 8, 7, 1];

const distinctSum = arr => {
  let res = 0;
  for (let i = 0; i < arr.length; i++) {
    // 現在位置がその値の最後の出現位置なら加算する
    if (i === arr.lastIndexOf(arr[i])) {
      res += arr[i];
    }
  }
  return res;
};

console.log(distinctSum(arr));

出力

コンソールには次のように表示されます。

30

この方法は直感的で理解しやすい反面、各要素ごとに lastIndexOf() を呼び出すため、計算量は O(n²) になります。大きな配列では処理が遅くなる可能性がある点に注意してください。

より効率的な方法:Set を使う

ES2015で導入された Set オブジェクトを使うと、重複を自動的に除外できるため、より簡潔かつ高速(O(n))に記述できます。

const distinctSum = arr => [...new Set(arr)].reduce((sum, num) => sum + num, 0);

console.log(distinctSum([1, 5, 2, 1, 2, 3, 4, 5, 7, 8, 7, 1])); // 30

new Set(arr) で重複を除いた集合を作成し、スプレッド構文で配列に戻したうえで、reduce() を使って合計を計算しています。ワンライナーで書けるため、実務でもおすすめの書き方です。

まとめ

  • 配列の一意な要素の合計を求めるには、lastIndexOf() で最後の出現位置だけを加算する方法が使える。
  • Setreduce() を組み合わせると、より簡潔でパフォーマンスの高い実装になる。
  • データ量が多い場合は O(n) のSet方式を選ぶとよい。
  1. JavaScriptで配列の合計値が偶数か奇数かを判定する方法

    本記事では、配列内の全要素の合計を求め、その結果が偶数か奇数かに応じて文字列を返すJavaScript関数の実装方法を解説します。 問題 整数の配列 arr を引数として受け取るJavaScript関数を作成する必要があります。この関数は、配列内のすべての要素の合計が奇数であれば文字列「odd」を、偶数であれば文字列「even」を返すようにします。 解決のアプローチ まず、配列メソッドの reduce() を使って配列全体の合計値を算出します。次に、合計値を 2 で割った余り(剰余演算子 % の結果)が 0 かどうかをチェックすることで、偶数・奇数の判定を行います。 コード例 以下が実際のコ

  2. JavaScriptで2次元配列の要素を交互に加減算して合計を求める方法

    問題の概要行数と列数が同じ m × n の2次元配列(数値の行列)を受け取り、次の式で表される合計値を計算して返すJavaScript関数を作成します。$\sum_{i=1}^m \sum_{j=1}^n (-1)^{i+j}a_{ij}$この式が意味するのは、各要素に対して「インデックス i + j の偶奇」に応じて符号を切り替えるということです。具体的には、(i + j) が偶数である要素は正の符号で加算し、奇数である要素は負の符号で減算します。チェス盤のように市松模様状にプラスとマイナスが交互に並ぶイメージです。計算イメージ0始まりのインデックスで考えると、左上の要素 (0, 0) は