配列の合計を出す

合計は reduce に初期値 0 を渡すのが基本です。小数がずれる理由、空配列で例外になる条件、オブジェクトの配列の合計、大きすぎる数の扱いまで、実行して確かめます。

実行して検証済み処理系Node 22.22.3対応ES5難易度●●○○○目安8更新

答え

reduce()初期値 0を渡します。

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
10
javascript
console.log([].reduce((sum, n) => sum + n));
TypeError: Reduce of empty array with no initial value

初期値の 0 を省かないでください。 空配列で例外になります(後述)。

上のコードは書き換えて実行できます。0100 にしてみてください。

空配列で落ちないこと

初期値が無く要素も無いと、返すものが決まらず例外になります。

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
[] 0
javascript
const prices = [0.1, 0.2, 0.3];

console.log(prices.reduce((sum, n) => sum + n, 0));
console.log(prices.reduce((sum, n) => sum + n, 0) === 0.6);
0.6000000000000001 false

空配列は普通に起こります。 filter() の結果が空、取得件数が0件、未入力。

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
60 0.6
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
0.6 true

初期値があれば 0 が返ります。合計は0件なら0が自然です。

小数はずれる

ここがいちばん多い事故です。

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
200 480
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
480

2進数で 0.1 を正確に表せないためで、reduce() のせいではありません。 理由は なぜ 0.1 + 0.2 は 0.30000000000000004 になるのか にあります。

直しかた: 整数で足す

金額なら、最小単位の整数で持ちます。円なら円、ドルならセント。

javascript
const inputs = ['10', '20', '30'];

console.log(inputs.reduce((sum, n) => sum + n, 0));
0102030
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
60

すでに小数で持っているなら、足す前に整数へ寄せます。

javascript
const inputs = ['10', 'あ', '30'];

console.log(inputs.reduce((sum, n) => sum + Number(n), 0));
NaN
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
[ 10, 30, 0 ] 40

桁数(ここでは 100)は扱う通貨に合わせます。円なら 1、ドルなら 100 です。

オブジェクトの配列を合計する

足したい値を取り出してから足します。

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
[ 10, 30 ] 40
javascript
const big = [9007199254740991, 1, 1];

console.log(big.reduce((sum, n) => sum + n, 0));
9007199254740992

map() を挟むと読みやすくなります。

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
9007199254740993n
javascript
console.log([1n, 2n].reduce((sum, n) => sum + n, 0));
TypeError: Cannot mix BigInt and other types, use explicit conversions

配列を1回余分に作りますが、この規模なら差は出ません。読みやすさを優先してください。

値が数値とは限らないとき

フォームから来た値は文字列です。そのまま足すと繋がります。

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
10 10

0 + '10''010' になり、以降ずっと文字列です。

数値に変換できないものが混ざると NaN になります。

NaN一度混ざると最後まで残ります。どこで壊れたか分からなくなります。

先に弾いてください。

''0 として残っていることに注意してください。 'あ'NaN になって落ちましたが、'' は最後尾の 0 として生き残っています。 Number('')0 です。未入力を弾きたいなら、変換の前に落とします。

変換の詳しい話は 文字列を数値に変換する にあります。

大きすぎる合計

合計が9007199254740991を超えると、正確でなくなります

12回足したのに、1しか増えていません。

BigInt で足します。

初期値も 0n にする必要があります。00n は足せません

他のやり方

書き方 空配列 向いている場面
reduce(…, 0) 0 が返る ほぼ常にこれ
for...of で足す 0 が返る 途中で抜けたい・条件が複雑なとき
reduce()(初期値なし) 例外 使わない

どちらでも構いません。 reduce() のほうが「合計を作っている」と読めます。

reduce() そのものの説明は Array.prototype.reduce() にまとめてあります。 キーごとに分けて合計したいなら 配列をキーごとにまとめる を見てください。

この記事の根拠

  1. Array.prototype.reduce — ECMAScript® 2026 Language Specificationtc39.es
  2. Number.MAX_SAFE_INTEGER — ECMAScript® 2026 Language Specificationtc39.es

掲載しているコード例は、公開前に読み手が押したときに動くのと同じもので実行して出力を突き合わせています。結果はリポジトリに残しています。

このページの原文(Markdown)