const {objEqual} = require("@/libs/tools/tools");
/**
 * @desc   : 取得原数组跟目标数组的交集
 * @author : 周兴
 * @date   : 2022/11/15 17:21
 */
Array.prototype.intersection = function (arr) {
  if (!this || !arr || arr.length == 0) return this;
  // 如果第一个是对象，那么就按照对象数组来进行
  if (typeof arr[0] == 'object') {
    return this.filter(it => arr.has(it))
  }
  return this.filter(it => arr.includes(it))
}

/**
 * @desc   : 取得原数组跟目标数组的并集
 * @author : 周兴
 * @date   : 2022/11/15 17:26
 */
Array.prototype.union = function (...arr) {
  if (!this || !arr || arr.length == 0) return this;
  return this.concat(...arr)
}


/**
 * @desc   : 取得原数组跟目标数组的差集
 * @author : 周兴
 * @date   : 2022/11/15 17:26
 * @param  : arr：目标数组；cols,需要判断的列
 */
Array.prototype.minus = function (arr, cols = []) {
  if (!this || !arr || arr.length == 0) return this;
  // 如果第一个是对象，那么就按照对象数组来进行
  if (typeof arr[0] == 'object') {
    if (!cols) {
      return this.filter(it => !arr.has(it))
    } else {
      let arrt = arr.map(it => {
        let item = {}
        cols.forEach(col => {
          item[col] = it[col]
        })
        return item;
      })
      let thisTable = this.map(it => {
        let item = {}
        cols.forEach(col => {
          item[col] = it[col]
        })
        return item;
      })
      return thisTable.filter(it => !arrt.has(it))
    }
  }
  return this.filter(it => !arr.includes(it))
}


/**
 * @desc   : 插入数组，去除重复项
 * @author : 周兴
 * @date   : 2022/11/29 17:22
 */
Array.prototype.pushNoRepeat = function (obj) {
  if (!this || !obj) return this;
  if (typeof obj == 'object') {
    if (!this.has(obj)) {
      this.push(obj);
    }
  } else {
    if (!this.includes(obj)) {
      this.push(obj);
    }
  }
  return this;
}

/**
 * @desc   : 数组的复制
 * @author : 周兴
 * @date   : 2022/12/8 17:45
 */
Array.prototype.copy = function () {
  if (!this) return this;
  return JSON.parse(JSON.stringify(this));
}

/**
 * @desc   : 数组去重
 * @author : 周兴
 * @date   : 2022/12/14 16:14
 */
Array.prototype.unique = function () {
  if (!this || this.length == 0) return this;
  if (typeof this[0] === 'object') {
    let arr = []
    return this.filter(item => !arr.has(item) && arr.push(item))
  } else {
    return Array.from(new Set(this));
  }
}

/**
 * @desc   : 数组计算合计
 * @author : 周兴
 * @date   : 2022/10/24 13:04
 */
Array.prototype.sum = function (name) {
  if (!name) {
    return this.reduce((acc, cur) => (parseFloat(cur) + acc), 0);
  } else {
    return this.filter(it => it[name]).map(it => it[name]).reduce(
      (acc, cur) => (parseFloat(cur) + acc), 0);
  }
}

/**
 * @desc   : 获取数组中的最小值
 * @author : 周兴
 * @date   : 2023/2/13 15:47
 */
Array.prototype.min = function (name) {
  if (!name) {
    return this.reduce((acc, cur) => acc < cur ? acc : cur);
  } else {
    return this.filter(it => it[name]).map(it => it[name]).reduce(
      (acc, cur) => acc < cur ? acc : cur);
  }
}

/**
 * @desc   : 获取数组中的最小值
 * @author : 周兴
 * @date   : 2023/2/13 15:47
 */
Array.prototype.max = function (name) {
  if (!name) {
    return this.reduce((acc, cur) => acc > cur ? acc : cur);
  } else {
    return this.filter(it => it[name]).map(it => it[name]).reduce(
      (acc, cur) => acc > cur ? acc : cur);
  }
}

/**
 * @desc   : 数据判断是否有数据
 * @author : 周兴
 * @date   : 2022/10/24 13:04
 */
Array.prototype.size = function () {
  if (!this) return 0;
  if (this && this.length > 0) {
    return this.length;
  }
  return 0;
}

/**
 * @desc   : 数组过滤
 * @author : 周兴
 * @date   : 2022/10/24 13:04
 */
Array.prototype.filterExt = function (value, name) {
  if (!name) {
    return this.filter(it => it == value);
  } else {
    return this.filter(it => it[name] == value);
  }
}

/**
 * @desc   : 更新数组的值
 * @author : 周兴
 * @date   : 2022/11/18 9:49
 */
Array.prototype.update = function (obj, keyField, valueField, thisKeyField, thisValueField) {
  if (!this || this.length == 0) return this;
  if (!thisKeyField) {
    thisKeyField = keyField
  }
  if (!thisValueField) {
    thisValueField = valueField
  }
  let filters = this.filter(it => it[thisKeyField] === obj[keyField]);
  if (filters && filters.length > 0) {
    filters.forEach(it => {
      it[thisValueField] = obj[valueField];
    })
  }
  return this;
}

/**
 * @desc   : 更新数组的值(所有列）
 * @author : 周兴
 * @param  : field:需要更新的列，value:需要更新的值
 * @date   : 2022/11/18 9:49
 */
Array.prototype.updateAll = function (field, value) {
  if (!this || this.length == 0 || !field) return this;
  this.forEach(it => {
    it[field] = value;
  })
  return this;
}

/**
 * @desc   : 给数组填充数据
 * @author : 周兴
 * @param  : keyArr，键数组，valueArr，值数组
 * @date   : 2022/11/22 10:34
 */
Array.prototype.fillArray = function (keyArr, valueArr) {
  if (!this || !keyArr || !valueArr) return this;
  if (keyArr.length != valueArr.length) return this;
  let arr = this;
  if (arr && arr.length > 0) {
    for (let i = 0; i < keyArr.length; i++) {
      arr.forEach(it => {
        it[keyArr[i]] = valueArr[i]
      })
    }
  }
}

/**
 * @desc   : 判断数组中是否包含这个对象
 * @author : 周兴
 * @date   : 2022/11/16 9:11
 */
Array.prototype.has = function (obj) {
  if (this && this.length > 0) {
    for (let i of this) {
      if (objEqual(i, obj)) {
        return true;
      }
    }
    return false;
  }
}

/**
 * @desc   : 根据传入的列对集合进行过滤
 * @author : 周兴
 * @date   : 2023/2/22 14:04
 * @param  : 结果集中的列
 */
Array.prototype.filterColumns = function (columns) {
  if (!this || this.length === 0 || !columns || columns.length === 0) return this;
  return this.map(it => {
    let item = {}
    columns.forEach(col => {
      item[col] = it[col]
    })
    return item;
  })
}

/**
 * 获取数组中重复的数据
 * @param {*} list
 * @returns
 */
Array.prototype.getRepeatItem = function (objFlag) {
  if (!this) return [];
  let tmp = [];
  objFlag = objFlag ? objFlag : false;
  if (!objFlag) {
    this.sort().sort(function (a, b) {
      if (a === b && tmp.indexOf(a) === -1) {
        tmp.push(a);
      }
    });
  } else {
    this.sort().sort(function (a, b) {
      if (objEqual(a, b) && tmp.indexOf(a) === -1) {
        tmp.push(a);
      }
    });
  }
  return tmp;
};

/**
 * @desc   : 判断是否为空数组
 * @author : 张潇木
 * @date   : 2023/5/31 15:44
 */
Array.prototype.isEmptyArray = function () {
  if(Array.prototype.isPrototypeOf(this)&&this.length === 0){
    return true
  }else{
    return false
  }

}



