Vue-方法封装

// 使用说明查看 README.md
let commonJs = {}

// 1、深拷贝
commonJs.deepMerge = (target, source) => {
  // 判断被拷贝对象是Object
  // 陷阱!!typeof(null) === 'object' true
  if (typeof (target) !== 'object' || target === null) {
    target = {}
  }
  // 开始拷贝
  // 拷贝者需要为一个Object
  if (source !== null && typeof (source) === 'object') {
    for (var name in source) {
      // 获取被拷贝对象的同名键值
      var src = target[name]
      // 拷贝对象的键值
      var copy = source[name]
      // 防止环引用
      // 如果拷贝对象的键值===被拷贝对象
      // 被拷贝对象可以通过自身的键不停的去找到自身,形成死循环
      if (target === copy) {
        continue
      }
      if (typeof (copy) === 'object' && copy !== null) {
        if (Array.isArray(copy)) {
          src = src && Array.isArray(src) ? src : []
        } else {
          src = src && typeof (src) === 'object' && !Array.isArray(src) ? src : {}
        }
        target[name] = commonJs.deepMerge(src, copy)
      } else {
        target[name] = copy
      }
    }
  }
  return target
}
///2、获取地址栏参数
commonJs.getUrl = (obj, bool) => {
  let urlObj = {}
  let str = location.href
  if (str.indexOf('?') != -1) {
    // 获取地址栏参数
    let num = str.indexOf("?")
    str = str.substr(num + 1)
    let arr = str.split("&")
    arr.forEach(item => {
      let query = item.split("=")
      if (query[0]) {
        urlObj[query[0]] = JSON.parse(decodeURI(query[1]))
      }
    })
    // 设置回调值
    if (!obj) {
      return urlObj
    }
    if (typeof(obj) == 'string') { // obj为字符串时,bool表示希望得到的值类型:Number(数字类型)、String(字符串类型),默认 String
      if (bool) {
        return bool(urlObj[obj])
      } else {
        return urlObj[obj]
      }
    } else {
      if (bool) { // 仅return传递的参数
        let onlyObj = {}
        obj.forEach(key => {
          if (typeof(key.name) == 'string') { // name为字符串
            if (urlObj[key.name] !== undefined) {
              if (key.type) {
                onlyObj[key.name] = key.type(urlObj[key.name])
              } else {
                onlyObj[key.name] = urlObj[key.name]
              }
            }
          } else { // name为数组
            onlyObj[key.concat] = []
            key.name.forEach(item => {
              if (urlObj[item]) {
                onlyObj[key.concat].push(urlObj[item])
              }
            })
          }
        })
        return onlyObj
      } else { // 非仅return传递的参数
        obj.forEach(key => {
          if (typeof(key.name) == 'string') { // name为string
            if (urlObj[key.name] !== undefined) {
              if (key.type) {
                urlObj[key.name] = key.type(urlObj[key.name])
              } else {
                urlObj[key.name] = urlObj[key.name]
              }
              if (key.delete) {
                delete urlObj[key.name]
              }
            }
          } else { // name为数组
            urlObj[key.concat] = []
            key.name.forEach(item => {
              if (urlObj[item]){
                if (key.type) {
                  urlObj[key.concat].push(key.type(urlObj[item]))
                } else {
                  urlObj[key.concat].push(urlObj[item])
                }
              }
            })
          }
        })
        return urlObj
      }
    }
  } else {
    if (typeof(obj) == 'string') {
      return ''
    } else {
      return {}
    }
  }
}
// 3、删除空字段
commonJs.deleteEmpty = (obj, config) => {
  let objKey = JSON.parse(JSON.stringify(obj))
  Object.keys(objKey).forEach((key) => {
    if (objKey[key] === '' || objKey[key] === null) {
      delete objKey[key]
    }
  })
  return objKey
}
///4、拼接地址栏参数
commonJs.queryConcat = (obj, config) => {
  let query = ''
  let reg = new RegExp("[\\u4E00-\\u9FFF]+","g")
  for (let key in obj) {
    if (reg.test(obj[key])) {
      if (!config || config[key].isJSON) {
        obj[key] = JSON.stringify(obj[key])
      }
    }
    query += `&${key}=${obj[key]}`
  }
  if (query) query = query.replace(/&/, '?')
  return query
}
// 5、页面回到顶部
commonJs.backTop = (obj, config) => {
  obj = obj || {}
  window.parent.scrollTo({
    top: obj.top || 0,
    behavior: obj.behavior || 'smooth'
  })
}
///6、获取当前日期时间
commonJs.getDate = (config) => {
  let obj = config || {}
  if (!obj.symbol) obj.symbol = '-'           // 分隔符
  if (obj.zero === undefined) obj.zero = true // 加 0
  if (!obj.month) obj.month = 1               // 前n月,默认 1
  if (!obj.day) obj.day = 1                   // 前n天,默认 1
  if(!obj.week) obj.week = 1                  // 前n周,默认 1
  obj.zero = obj.zero ? '0' : ''        
  const dateObj = ['nowTime', 'beforeDayTime', 'beforeWeekTime', 'beforeTime']
  // 设置时间
  const formatTime = () => {
    let timeObj = {}
    dateObj.forEach((item, index) => {
      let date = new Date()
      switch(index) {
        case 1:
          // 前n天时间获取
          date = new Date(date.getTime() - obj.day * 24 * 3600 * 1000)
          break;
        case 2:
          // 前n周时间获取
          date = new Date(date.getTime() - (obj.week * 7) * 24 * 3600 * 1000)
          break;
        case 3:
          // 前n月时间获取
          date.setMonth(date.getMonth() - obj.month)
          break;
      }
      let year = date.getFullYear()
      let month = date.getMonth() + 1
      let day = date.getDate()
      let hour = date.getHours()
      let minute = date.getMinutes()
      let second = date.getSeconds()
      let dateMonth = [year, month].map(formatNumber).join(obj.symbol)
      let datePicker = [year, month, day].map(formatNumber).join(obj.symbol)
      let timePicker = [hour, minute, second].map(formatNumber).join(':')
      timeObj[item] = {
        year: year,                 //
        month: month,               //
        day: day,                   //
        hour: hour,                 //
        minute: minute,             //
        second: second,             //
        dateMonth: dateMonth,       // 年月
        datePicker: datePicker,     // 日期
        timePicker: timePicker,     // 时间
        dateTimePicker: `${datePicker} ${timePicker}`,    // 日期时间
        dateStamp: new Date(datePicker).getTime() / 1000, // 日期时间戳
        dateTimeStamp: new Date(`${datePicker} ${timePicker}`).getTime() / 1000, // 日期时间时间戳
      }
    })
    return timeObj
  }
  // 小于10时是否加0
  const formatNumber = n => {
    n = n.toString()
    return n[1] ? n : obj.zero + n
  }
  return formatTime()
}

export default commonJs

 

posted @ 2023-11-17 16:25  忙着可爱呀~  阅读(27)  评论(0)    收藏  举报