-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
33 lines (25 loc) · 908 Bytes
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import {errorIfLengthIsZero} from 'error-if-length-is-zero';
import {getArrayCopy} from '@writetome51/get-array-copy';
import {getRoundedDown} from '@writetome51/get-rounded-up-down';
import {isOdd} from '@writetome51/is-odd-is-even';
import {orderNumerically} from '@writetome51/order-numerically';
export function getMedian(numbers) {
errorIfLengthIsZero(numbers);
let orderedNumbers = getOrdered(numbers);
return getMedianFromOrdered(orderedNumbers);
function getOrdered(numbers) {
numbers = getArrayCopy(numbers);
orderNumerically(numbers);
return numbers;
}
function getMedianFromOrdered(numbers) {
const toNum = Number, length = numbers.length, halfLength = length / 2;
if (isOdd(length)) {
let middleIndex = getRoundedDown(halfLength);
return toNum(numbers[middleIndex]);
}
else return (
(toNum(numbers[halfLength - 1]) + toNum(numbers[halfLength])) / 2
);
}
}