JavaScriptで配列の一意な要素のみを合計する方法
JavaScriptでは、重複した数値が含まれる可能性のある数値の配列を受け取り、一意な要素(配列内に一度だけ出現する要素)のみを合計して返す関数が必要になることがあります。本記事では、その実装方法をわかりやすく解説します。
具体例
入力配列が次の場合を考えてみましょう。
const arr = [2, 5, 5, 3, 2, 7, 4, 9, 9, 11];
この配列の中で一度だけ出現する要素は「3」「7」「4」「11」です。これらの合計は25となるため、期待される出力は25になります。
アプローチ: forループで重複を判定する
最もシンプルな方法は、forループで配列を反復処理しながら、各要素の出現回数をチェックするものです。indexOf()とlastIndexOf()の結果を比較し、両者が一致しなければその要素は複数回出現しているためスキップし、一致する場合のみ合計に加算します。
コード例
const arr = [2, 5, 5, 3, 2, 7, 4, 9, 9, 11];
const sumUnique = arr => {
let res = 0;
for(let i = 0; i < arr.length; i++){
// 出現位置が先頭と末尾で異なる場合は重複しているためスキップ
if(arr.indexOf(arr[i]) !== arr.lastIndexOf(arr[i])){
continue;
};
res += arr[i];
};
return res;
};
console.log(sumUnique(arr));出力
コンソールには次のように表示されます。
25
別解: filter() と reduce() を組み合わせる
よりモダンで簡潔な書き方として、filter()メソッドで一意な要素だけを抽出し、reduce()で合計を求める方法もあります。
const arr = [2, 5, 5, 3, 2, 7, 4, 9, 9, 11];
const sumUnique = arr => {
return arr
.filter(num => arr.indexOf(num) === arr.lastIndexOf(num))
.reduce((sum, num) => sum + num, 0);
};
console.log(sumUnique(arr)); // 25どちらのアプローチでも結果は同じですが、filter()とreduce()を使う方法は処理の意図が明確になり、可読性の高いコードになります。データ量が多い配列を扱う場合は、パフォーマンスを考慮して実装方法を選択するとよいでしょう。
-
JavaScriptのArray.values()メソッドとは?使い方とサンプルコードを徹底解説
JavaScriptのArray.values()メソッドとは? JavaScriptのArray.values()メソッドは、対象の配列に含まれるすべての値を格納したイテレーターオブジェクトを返します。ES2015(ES6)以降で利用可能なこのメソッドは、for...ofループやスプレッド構文([...arr])と組み合わせることで、配列の各要素を効率的に取り出せます。 なお、keys()やentries()がインデックス情報も一緒に返すのに対し、values()は純粋に「値」だけを順番に提供する点が大きな特徴です。 基本構文 arr.values() 引数は不要で、戻り値として新しいArr
-
JavaScript配列から一意の値(重複なし)を取得する方法
JavaScriptの配列に含まれる重複した値を取り除き、一意の値(ユニークな値)だけを取得したい場合は、Setオブジェクトを使うのが最もシンプルで効率的な方法です。 Setは同じ値を1つしか格納できないデータ構造のため、配列をnew Set()に渡すだけで自動的に重複が排除されます。その後、スプレッド構文([...set])を使えば、簡単に元の配列形式へ戻すことができます。 サンプルコード 以下は、JavaScriptの配列からすべての一意の値を取得する実際のコード例です。 <!DOCTYPE html> <html lang=ja> <head> <