Range Analyze

Range Analyze

by evgkch

JavaScript

/**
 * Numeric array handler
 */
class Range {
  /**
   * get avarage
   * @param  {number[]} args
   * @return {number}
   */
  static getAvarage(args) {
    return args.reduce((a, b) => a + b) / args.length;
  }
  /**
   * get square sum - supporting method
   * @param  {number[]} [[first, ...rest]]
   * @param  {number}   [avarage=Range.getAvarage([first, ...rest])]
   * @return {number}
   */
  static getSquareSum([first, ...rest], avarage = Range.getAvarage([first, ...rest])) {
    return [...rest].length === 0
    	? (avarage - first) * (avarage - first)
      : (avarage - first) * (avarage - first) + Range.getSquareSum([...rest], avarage);
  }
  /**
   * get dispersion
   * @param  {number[]} [args]
   * @param  {number}   [avarage=Range.getAvarage([first, ...rest])]
   * @return {number}
   */
  static getDispersion(args, avarage = Range.getAvarage(args)) {
    return Range.getSquareSum(args, avarage) / args.length;
  }
  /**
   * get standart deviation
   * @param  {number[]} [args]
   * @param  {number}   [avarage=Range.getAvarage([first, ...rest])]
   * @return {number}
   */
  static getStandartDeviation(args, avarage = Range.getAvarage(args)) {
    return Math.sqrt(Range.getDispersion(args, avarage));
  }
  /**
   * analyze range
   * @param  {number[]} [args]
   * @return {{average: number, standartDeviation: number}}
   */
  static analyze(args) {
    const average = Range.getAvarage(args);
    const standartDeviation = Range.getStandartDeviation(args, average);
    return { average, standartDeviation };
  }

}