/* eslint-disable no-unused-expressions */
// 使用递归遍历所有属性判断是否 在对象里面匹配到值 借鉴js对象深拷贝的方式
function loopObj (searkey, obj) {
  let bool = false
  let loop = (searkey, obj) => {
    for (let key in obj) {
      if (
        String(obj[key])
          .trim()
          .indexOf(searkey) !== -1
      ) {
        bool = true
      }
      if (typeof obj[key] === 'object' && obj[key] !== null) {
        loop(searkey, obj[key])
      }
    }
  }
  loop(searkey, obj)
  return bool
}

let tool = {
  /**
   * 搜索函数
   * @param {*} arr   搜索目标
   * @param {*} str   搜索参数
   */
  setSearch: function (arr, str) {
    let arrTrueList = [] // 匹配的数据
    let arrFalseList = [] // 不匹配数据
    arr.forEach(item => {
      // 判断输入值key 是否存在对象数组上面
      if (loopObj(str, item)) {
        arrTrueList.push(item)
      } else {
        arrFalseList.push(item)
      }
    })
    return arrTrueList
  },

  /**
   * 筛选函数
   * @param {*} array   筛选参数
   * @param {*} filters 筛选目标
   */
  multiFilter: function (array, filters) {
    const filterKeys = Object.keys(filters)
    return array.filter(item => {
      return filterKeys.every(key => {
        if (!filters[key].length) return true
        return !!~filters[key].indexOf(item[key])
      })
    })
  },

  /**
   * 数组对象去重
   * @param {*} arr 目标数组
   * @param {*} reference 去重参数
   */
  arrayHeavy: function unique (arr, reference) {
    let map = new Map()
    arr.forEach((item, index) => {
      if (!map.has(item[reference])) {
        map.set(item[reference], item)
      }
    })
    return [...map.values()]
  }
}

export default tool
