JavaScriptやTypeScriptでAverage(平均)を計算したい!
業務でNodeを使ってツールを作成した際に平均を取得したい時がありましたのでまとめておきます。
フロントエンドでのJavaScriptやTypeScriptの処理でも同様に使用できるので、ご活用ください。
- 合計を計算したい!
- 中央値を取得したい!
という場合は、こちらに記事にまとめておきましたのでこちらを参照してください!
平均とは?
普段の生活でも使うので特に説明不要かと思いますが、個々の値を全て足し合わせてその個数で割った値のことです。
Reduceを使用して平均を出す方法
オススメなReduceを使用して平均を出す方法を2パターン紹介していきます。
※計算結果はMath.floorで切り捨てているので、実際にコピペする時はそこら辺問題ないかよく検討してからご使用ください。
reduceを使用する方法1
こちらの記事で使用したsum(合計)を利用して平均を求める方法です!
まず全部合計してから、単純に数で割る方法です!
JavaScript
const sum = (numbers, initialValue = 0) => numbers.reduce(
(accumulator, currentValue) => accumulator + currentValue,
initialValue
)
const average = (numbers) => Math.floor(sum(numbers) / numbers.length)
console.log(average([100, 200, 300, 400, 500]))
console.log(average([100, 200, 300, 400, 500, 600]))
console.log(average([600, 600, 100, 200, 300, 400, 500]))
% node index.js
300
350
385
TypeScript
const sum = (numbers: number[], initialValue: number = 0) => numbers.reduce(
(accumulator: number, currentValue: number) => accumulator + currentValue,
initialValue
)
const average = (numbers: number[]) => Math.floor(sum(numbers) / numbers.length)
console.log(average([100, 200, 300, 400, 500]))
console.log(average([100, 200, 300, 400, 500, 600]))
console.log(average([600, 600, 100, 200, 300, 400, 500]))
% ts-node index.ts
300
350
385
reduceを使用する方法2
こちらはちょっと特殊?な平均の出し方ですが、こちらの方が効率的になりそうな気はします。
個々の値を数で割ってから足し込む方法です!
小学校の算数レベル?ぐらいではあると思うので使えるようにしておきたいですね!
まず勘違いしやすいので気をつけたいのがここ。
accumulator + currentValue / length
計算の順番がこうなているので注意してください。
accumulator + ( currentValue / length )
そして、平均の計算でlengthを使用するため、4つ目の引数も利用しています。
The reducer function takes four arguments:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce
1. Accumulator
2. Current Value
3. Current Index
4. Source Array
JavaScript
const average = numbers => {
const reducer = (accumulator, currentValue, _, { length }) => accumulator + currentValue / length
return Math.floor(numbers.reduce(reducer, 0))
}
console.log(average([100, 200, 300, 400, 500]))
console.log(average([100, 200, 300, 400, 500, 600]))
console.log(average([600, 600, 100, 200, 300, 400, 500]))
% node index.js
300
350
385
TypeScript
const average = (numbers: number[]) => {
const reducer = (accumulator: number, currentValue: number, _: number, { length }: { length: number }) => accumulator + currentValue / length
return Math.floor(numbers.reduce(reducer, 0))
}
console.log(average([100, 200, 300, 400, 500]))
console.log(average([100, 200, 300, 400, 500, 600]))
console.log(average([600, 600, 100, 200, 300, 400, 500]))
% ts-node index.ts
300
350
385
for, forEachを使用して平均を出す方法
おまけではありますが、for, forEachを使用した方法も記載しておきます。
for文を使用する方法
サンプル1
こちらは全部合計してから、単純に数で割る方法です!
const numbers = [100, 200, 300, 400, 500]
let total = 0
for (let i = 0; i < numbers.length; i++) {
total += numbers[i]
}
const average = total / numbers.length
// 300
console.log(average)
サンプル2
こちらは個々の値を数で割ってから足し込む方法です!
const numbers = [100, 200, 300, 400, 500]
let average = 0
for (let i = 0; i < numbers.length; i++) {
average += numbers[i] / numbers.length
}
// 300
console.log(average)
forEachを使用する方法
サンプル1
こちらは全部合計してから、単純に数で割る方法です!
const numbers = [100, 200, 300, 400, 500]
let total = 0
numbers.forEach(num => total += num)
const average = total / numbers.length
// 300
console.log(average)
サンプル2
こちらは個々の値を数で割ってから足し込む方法です!
const numbers = [100, 200, 300, 400, 500]
let average = 0
numbers.forEach(num => average += num / numbers.length)
// 300
console.log(average)
まとめ
今回は、JavaScriptやTypeScriptでAverage(平均)を計算する方法について纏めました!
何年かエンジニアをやってれば何回かはこの平均を求める処理を書くことになるのですが、JavaScriptやTypeScriptでコピペでそのまま使えるような気に入った物がネット上になかったため纏めておきました!
もし書き方など気に入りましたら、コピペで使ってください!
コメント