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));
  }

  static getMin(args) {
    let min;
    for (let arg of args) {
      if (!min || arg < min) min = arg;
    }
    return min;
  }

  static getMax(args) {
    let max;
    for (let arg of args) {
      if (!max || arg > min) max = arg;
    }
    return max;
  }

  static invert(range) {
    return Array.from(range, (v, k) => range[range.length - k - 1]);
  }

  /**
   * Analyze range by options
   * @param  {Number[]} args
   * @return {Object}
   */
  static analyze(args, options = {}) {
    const analytics = {};
    analytics['length'] = args.length;
    if (options.min === true) {
      analytics['min'] = Range.getMin(args);
    }
    if (options.max === true) {
      analytics['max'] = Range.getMax(args);
    }
    if (options.sum === true) {
  ...