You've already forked guangan-mp
78 lines
1.8 KiB
JavaScript
78 lines
1.8 KiB
JavaScript
/**
|
|
* 获取值的原始类型字符串,例如 [object Object]
|
|
*/
|
|
const _toString = Object.prototype.toString
|
|
|
|
/**
|
|
* 判断是否为数组
|
|
* @param {*} val 要判断的值
|
|
* @returns {boolean} 返回判断结果
|
|
*/
|
|
export function isArray(val) {
|
|
return _toString.call(val) === '[object Array]'
|
|
}
|
|
|
|
/**
|
|
* 判断是否为普通对象
|
|
* @param {*} val 要判断的值
|
|
* @returns {boolean} 返回判断结果
|
|
*/
|
|
export function isPlainObject(val) {
|
|
return _toString.call(val) === '[object Object]'
|
|
}
|
|
|
|
/**
|
|
* 遍历
|
|
* @param {object|array} obj 要迭代的对象
|
|
* @param {function} fn 为每个项调用的回调
|
|
*/
|
|
export function forEach(obj, fn) {
|
|
if (obj === null || obj === undefined) return
|
|
if (typeof obj !== 'object') obj = [obj]
|
|
if (isArray(obj)) {
|
|
for (let i = 0, l = obj.length; i < l; i++) {
|
|
fn.call(null, obj[i], i, obj)
|
|
}
|
|
} else {
|
|
for (const k in obj) {
|
|
if (Object.prototype.hasOwnProperty.call(obj, k)) {
|
|
fn.call(null, obj[k], k, obj)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 对象深合并
|
|
* @param {...object} args 对象
|
|
* @returns {object} 合并后的对象
|
|
*/
|
|
export function merge(...args) {
|
|
const result = {}
|
|
for (let i = 0, l = args.length; i < l; i++) {
|
|
if (isPlainObject(args[i])) {
|
|
forEach(args[i], (val, key) => {
|
|
result[key] = assign(result[key], val)
|
|
})
|
|
}
|
|
}
|
|
return result
|
|
}
|
|
|
|
/**
|
|
* 合并分配到目标对象
|
|
* @param {*} target 目标对象
|
|
* @param {*} source 源对象
|
|
* @returns {*} 目标对象
|
|
*/
|
|
export function assign(target, source) {
|
|
if (isPlainObject(target) && isPlainObject(source)) {
|
|
return merge(target, source)
|
|
} else if (isPlainObject(source)) {
|
|
return merge({}, source)
|
|
} else if (isArray(source)) {
|
|
return source.slice()
|
|
}
|
|
return source
|
|
}
|