@silkytone/danmu
Version:
弹幕的简单实现,实现普通弹幕或高级弹幕。
69 lines (58 loc) • 1.92 kB
text/typescript
// utils/object.ts;
// TODO: 获取类型
export function getType(target: any): string {
return Object.prototype.toString.call(target).slice(8, -1);
}
// TODO: 判断类型
export function isType(target: any, type: string): boolean {
return getType(target).toLowerCase() === type.toLowerCase();
}
// TODO: 判断数组
export function isArray(target: any): target is Array<any> {
return isType(target, 'array');
}
// TODO: 判断对象
export function isObject(target: any): target is Object {
if (isFunction(target)) return false;
return isType(target, 'object');
}
// TODO: 判断函数
export function isFunction(target: any): target is Function {
return isType(target, 'function');
}
// TODO: 判断字符串
export function isString(target: any): target is string {
return isType(target, 'string');
}
// TODO: 判断数字
export function isNumber(target: any): target is number {
return isType(target, 'number');
}
// TODO: 判断布尔值
export function isBoolean(target: any): target is boolean {
return isType(target, 'boolean');
}
// TODO: 判断空对象
export function isEmpty(target: any): boolean {
if (['', null, undefined].includes(target)) return true;
return (isArray(target) ? target : Object.keys(target)).length === 0;
}
// TODO: 合并对象
export function mergeObject(target: Record<string | number, any>, ...sources: Array<Record<string | number, any>>) {
return sources.reduce((prev, curr) => {
if (isEmpty(curr)) return prev;
for (const [key, value] of Object.entries(curr)) {
const prevValue = prev[key];
if (isObject(value)) {
if (isObject(prevValue)) {
prev[key] = mergeObject(prevValue, value);
} else {
prev[key] = value;
}
} else {
prev[key] = value;
}
}
return prev;
}, { ...target });
}