JavaScriptで配列内の一意な要素の合計を求める方法
問題の概要
重複した数値を含む可能性のある数値の配列を受け取り、その中で一度だけ出現する要素(一意な要素)の合計を返すJavaScript関数を作成します。
例
入力配列が以下の場合を考えてみましょう。
const arr = [2, 5, 5, 3, 2, 7, 4, 9, 9, 11];
この配列の中で一度しか出現しない要素は 3、7、4、11 の4つです。したがって、期待される出力は次のようになります。
3 + 7 + 4 + 11 = 25
解決策:forループとindexOf / lastIndexOfを使う
基本的なアプローチとしては、forループで配列を反復処理しながら、indexOf() と lastIndexOf() の結果を比較します。この2つの戻り値が異なる場合、その要素は複数回出現しているためスキップし、一致する場合のみ合計に加算していきます。
コード例
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 => arr.filter(x => arr.indexOf(x) === arr.lastIndexOf(x)) .reduce((sum, val) => sum + val, 0); console.log(sumUnique(arr)); // 25
まとめ
どちらの方法でも、要素の出現回数を indexOf() と lastIndexOf() の比較によって判定できるのがポイントです。シンプルなロジックなので、初心者の方にも理解しやすい実装と言えるでしょう。パフォーマンスが重要になる大きな配列を扱う場合は、Map や Object を使って各要素の出現回数を先にカウントしておく方法も検討するとよいでしょう。
-
JavaScript配列から一意の値(重複なし)を取得する方法
JavaScriptの配列に含まれる重複した値を取り除き、一意の値(ユニークな値)だけを取得したい場合は、Setオブジェクトを使うのが最もシンプルで効率的な方法です。 Setは同じ値を1つしか格納できないデータ構造のため、配列をnew Set()に渡すだけで自動的に重複が排除されます。その後、スプレッド構文([...set])を使えば、簡単に元の配列形式へ戻すことができます。 サンプルコード 以下は、JavaScriptの配列からすべての一意の値を取得する実際のコード例です。 <!DOCTYPE html> <html lang=ja> <head> <
-
JavaScriptでエレベータが移動した階数の合計を求める方法
問題 ある時間帯において、建物のエレベータが停止した階数を要素として持つ配列を受け取り、その間にエレベータが移動した階数の合計を返すJavaScript関数を作成する必要があります。 解決のアプローチ この問題は、配列内の隣り合う2つの階数の差の絶対値を順番に足し合わせることで解決できます。例えば、7階から1階へ移動すれば6階分、1階から7階へ戻ればさらに6階分とカウントしていきます。最終的に、これらの差をすべて合計した値が、エレベータがカバーした総階数となります。 コード例 以下がその実装コードです。 const arr = [7, 1, 7, 1]; const floorsCovere