// 使用说明查看 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