/**
 * 数组类
 */
export class ArrayManager {
  constructor() {}

  /**
   * 数字类型数组排序
   * @param arr 数组
   * @param type  排序方式，asc:升序，desc：降序
   * 
   * @default asc
   */
  sort = (arr, type = "asc") => {
    let arrNew = JSON.parse(JSON.stringify(arr));
    arrNew.sort((a, b) => {
      if (type == "asc") {
        return a - b
      } else {
        return b - a
      }
    })
    return arrNew;
  }

  /**
   * 数组分割
   * @param arr 要处理的数组
   * @param len 分割长度
   */
  split = (arr, len) => {
    if (len == 0) {
      return arr;
    }
    let ret = []
    for (let i = 0; i < arr.length; i += len) {
      ret.push(arr.slice(i, i + len))
    }
    return ret
  }

  /**
   * 判断两个数组的数据是否相同
   * @param arr1  第一个数组
   * @param arr2  第二个数组
   * 
   * @@return {true/false}
   */
  isSame = (arr1, arr2) => {
    let newArr1 = JSON.parse(JSON.stringify(arr1));
    let newArr2 = JSON.parse(JSON.stringify(arr2));
    let arr1Sort = newArr1.sort().toString();
    let arr2Sort = newArr2.sort().toString();
    var c = newArr1.length === newArr2.length && arr1Sort === arr2Sort
    return c;
  }

  /**
   * 移除数组中的元素
   * @param arr 要操作的数组
   * @param value 要移除的值
   * 
   * @@return {Array} 移除元素后的数组
   */
  remove = (arr, value) => {
    let newArr = JSON.parse(JSON.stringify(arr));
    let indexOf = newArr.indexOf(value);
    if (indexOf >= 0) {
      newArr.splice(indexOf, 1)
    }
    return newArr;
  }

  /**
   * 添加新元素到指定位置
   */
  add = (arr, index, value) => {
    let newArr = JSON.parse(JSON.stringify(arr));
    newArr.splice(index, 0, value);
    return newArr;
  }

  /**
   * 数组中的最大值
   */
  max = (arr) => {
    let newArr = JSON.parse(JSON.stringify(arr));
    newArr.sort((a, b) => {
      return b - a
    })
    return newArr[0];
  }

  /**
   * 数组中的最小值
   */
  min = (arr) => {
    let newArr = JSON.parse(JSON.stringify(arr));
    newArr.sort((a, b) => {
      return a - b
    })
    return newArr[0];
  }

  /**
   * 数组打乱
   */
  disruption = (arr) => {
    return arr.sort(() => Math.random() - 0.5);
  }

  /**
   * 随机取值
   * @param arr 数组
   * @param length 取出的长度
   * @param isSame  是否可以相同
   */
  random = (arr, length = 1, isSame = false) => {
    if (arr.length <= length) {
      return arr;
    }
    let copyArr = JSON.parse(JSON.stringify(arr));
    let newArr = []; //创建一个新数组
    for (let i = 0; i < length; i++) {
      let temp = Math.floor(Math.random() * copyArr.length); //取随机下标
      newArr.push(copyArr[temp]); //添加到新数组
      if (!isSame) {
        copyArr.splice(temp, 1) //删除当前的数组元素,避免重复
      }
    }
    return newArr;
  }

  /**
   * 去重
   */
  unique = (arr) => {
    let copyArr = JSON.parse(JSON.stringify(arr));
    if (Array.hasOwnProperty('from')) {
      return Array.from(new Set(copyArr));
    } else {
      var n = {},
        r = [];
      for (var i = 0; i < copyArr.length; i++) {
        if (!n[copyArr[i]]) {
          n[copyArr[i]] = true;
          r.push(copyArr[i]);
        }
      }
      return r;
    }
  }

  /**
   * 合并去重
   */
  union = (arr, arr2) => {
    var newArr = arr.concat(arr2);
    return this.unique(newArr);
  }

  /**
   * 取交集
   */
  intersect = (arr, arr2) => {
    arr = this.unique(arr);
    let newArr = [];
    for (let i = 0; i < arr.length; i++) {
      if (arr2.includes(arr[i])) {
        newArr.push(arr[i])
      }
    }
    return newArr;
  }

  /**
   * 是否是数组
   */
  isArray(value) {
    if (typeof Array.isArray === 'function') {
      return Array.isArray(value)
    }
    return Object.prototype.toString.call(value) === '[object Array]'
  }

  /**
   * 平均值
   * @param {Object} arr
   */
  avg = (arr) => {
    let sum = 0;
    for (let i = 0; i < arr.length; i++) {
      sum += arr[i];
    }
    return sum / arr.length;
  }

  /**
   * 求和
   */
  sum = (arr, hex = 10) => {
    return arr.reduce((pre, cur) => {
      if (hex == 16) {
        return parseInt(parseInt('0x' + pre) + parseInt('0x' + cur)).toString(16)
      } else {
        return pre + cur
      }
    })
  }
}