- 比较是否相等
function looseEqual (a, b) {
if (a === b) { return true }
var isObjectA = isObject(a);
var isObjectB = isObject(b);
if (isObjectA && isObjectB) {
try {
var isArrayA = Array.isArray(a);
var isArrayB = Array.isArray(b);
if (isArrayA && isArrayB) {
return a.length === b.length && a.every(function (e, i) {
return looseEqual(e, b[i])
})
} else if (a instanceof Date && b instanceof Date) {
return a.getTime() === b.getTime()
} else if (!isArrayA && !isArrayB) {
var keysA = Object.keys(a);
var keysB = Object.keys(b);
return keysA.length === keysB.length && keysA.every(function (key) {
return looseEqual(a[key], b[key])
})
} else {
return false
}
} catch (e) {
return false
}
} else if (!isObjectA && !isObjectB) {
return String(a) === String(b)
} else {
return false
}
}
function isObject(obj) {
return typeof obj === 'object' && obj !== null
}
function isEqual(obj1, obj2) {
if (!isObject(obj1) || !isObject(obj2)) {
return obj1 === obj2
}
if (obj1 === obj2) {
return true
}
const obj1Keys = Object.keys(obj1)
const obj2Keys = Object.keys(obj2)
if (obj1Keys.length !== obj2Keys.length) {
return false
}
for (let key in obj1) {
const res = isEqual(obj1[key], obj2[key])
if (!res) {
return false
}
}
return true
}
- 深度复制
function deepClone(obj = {}) {
if (typeof obj !== 'object' || obj == null) {
return obj
}
let result
if (obj instanceof Array) {
result = []
} else {
result = {}
}
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
result[key] = deepClone(obj[key])
}
}
return result
}
- 防抖
function debounce(fn, delay = 500) {
let timer = null
return function () {
if (timer) {
clearTimeout(timer)
}
timer = setTimeout(() => {
fn.apply(this, arguments)
timer = null
}, delay)
}
}
- 节流
function throttle(fn, delay = 100) {
let timer = null
return function () {
if (timer) {
return
}
timer = setTimeout(() => {
fn.apply(this, arguments)
timer = null
}, delay)
}
}
- 数组拍平
function flat(arr) {
const isDeep = arr.some(item => item instanceof Array)
if (!isDeep) {
return arr
}
const res = Array.prototype.concat.apply([], arr)
return flat(res)
}
- 滚动条平滑滚动
function getScrollTop () {
return (document.documentElement && document.documentElement.scrollTop) || document.body.scrollTop;
},
function setScrollTop (value) {
window.scrollTo(0, value);
return value;
},
function scrollTo (to, duration) {
if (duration < 0) {
this.setScrollTop(to);
return
}
var diff = to - this.getScrollTop();
if (diff === 0) return
var step = diff / duration * 10;
requestAnimationFrame(
function () {
if (Math.abs(step) > Math.abs(diff)) {
setScrollTop(that.getScrollTop() + diff);
return;
}
setScrollTop(getScrollTop() + step);
if (diff > 0 && getScrollTop() >= to || diff < 0 && getScrollTop() <= to){
return;
}
scrollTo(to, duration - 16);
});
}
- 格式化startTime距现在的已过时间(距离传入的时间经多了多久
function formatPassTime(startTime) {
var currentTime = Date.parse(new Date()),
time = currentTime - startTime,
day = parseInt(time / (1000 * 60 * 60 * 24)),
hour = parseInt(time / (1000 * 60 * 60)),
min = parseInt(time / (1000 * 60)),
month = parseInt(day / 30),
year = parseInt(month / 12)
if (year) return year + '年前'
if (month) return month + '个月前'
if (day) return day + '天前'
if (hour) return hour + '小时前'
if (min) return min + '分钟前'
else return '刚刚'
}
- 深度assign
function mergeDeep (
source: Dictionary<any> = {},
target: Dictionary<any> = {}
) {
for (const key in target) {
const sourceProperty = source[key]
const targetProperty = target[key]
if (
isObject(sourceProperty) &&
isObject(targetProperty)
) {
source[key] = mergeDeep(sourceProperty, targetProperty)
continue
}
source[key] = targetProperty
}
return source
}
- omit排除对象中的元素
function omit(obj, fields) {
const shallowCopy = Object.assign({}, obj);
for (let i = 0; i < fields.length; i += 1) {
const key = fields[i];
delete shallowCopy[key];
}
return shallowCopy;
}
- pick找对象中匹配到的元素
const pick = (obj, ...fields) => {
let pickArr = fields
if (Array.isArray(...fields)) {
pickArr = fields[0]
}
return pickArr.reduce((res, item) => {
if (obj.hasOwnProperty(item)) {
res[item] = obj[item]
}
return res
}, {})
}
- 返回按对象下标顺序遍历的新对象
const objectOrder = (obj) => {
var newkey = Object.keys(obj).sort()
var newObj = {}
for (var i = 0; i < newkey.length; i++) {
newObj[newkey[i]] = obj[newkey[i]]
}
return newObj
}
- 生成唯一Id
function generateRandomKey(prefix) {
if (prefix == null) {
prefix = 'artist'
}
var userAgent = window.navigator.userAgent
.replace(/[^a-zA-Z0-9]/g, '')
.split('')
var mid = ''
for (var i = 0; i < 12; i++) {
mid += userAgent[Math.round(Math.random() * (userAgent.length - 1))]
}
var time = new Date().getTime()
return prefix + '_' + mid + '_' + time
}