core_index.js

import { isPlainObject, isUndefined } from "../modules/type";

export * from "./deep-copy";

/**
 * @method assignment
 * @description 向目标对象赋值,仅对目标对象target的key赋值,源source多余的key不会添加到target上
 * @param {object} target 待赋值目标对象
 * @param {object} source 赋值目标源
 * @return {object}
 * @example
 * const foo = {
 *  a:1
 * }
 * const fbb = {
 *  a:2,
 *  b:1
 * }
 * assignment(foo,fbb)
 * // { a:2 }
 */
export function assignment(target, source) {
    if (!isPlainObject(target) || !isPlainObject(source)) {
        return target;
    }

    for (let key in target) {
        if (!isUndefined(source[key])) {
            if (isPlainObject(target[key])) {
                target[key] = assignment(target[key], source[key]);
            } else {
                target[key] = source[key];
            }
        }
    }

    return target;
}

/**
 * @method firstUpperCase
 * @description 字符串首字母大写
 * @param {String} str
 * @return {String}
 * @example
 * firstUpperCase('test')
 * // Test
 */
export function firstUpperCase(str) {
    return str.replace(/\w/, (m) => m.toUpperCase());
}

/**
 * @method isWeakPassword
 * @description 是否为弱密码
 * @param {String} text
 * @return {Boolean}
 * @example
 * isWeakPassword('123')
 * // true
 */
export function isWeakPassword(text) {
    let isWeak = false;
    if (text) {
        const str =
            "abcdefghijklmnopqrstuvwxyz0123456789|9876543210zyxwvutsrqponmlkjihgfedcba";
        text.replace(/[^0-9]{3,}|[^a-z]{3,}/gi, function (m) {
            if (!isWeak) {
                isWeak =
                    /^(.)\1{2,}$/.test(m) || str.indexOf(m.toLowerCase()) > -1;
            }
        });
    }
    return isWeak;
}

/**
 * @method formatFileSize
 * @description 格式化文件大小
 * @param  {number} total 文件大小
 * @param  {number} [n = 0] total参数的原始单位如果为Byte,则n设为0,如果为KB,则n设为1,如果为MB,则n设为2,以此类推
 * @return {string} 带单位的文件大小的字符串
 * @example
 * formatFileSize(300)
 * // 300KB'
 */
export function formatFileSize(total, n = 0) {
    var unitArr = ["KB", "MB", "GB", "TB", "PB", "EB"];
    var len = total / 1024.0;

    if (len > 1000) {
        return formatFileSize(len, ++n);
    }

    return len.toPrecision(3) + unitArr[n];
}

/**
 * @method debounce
 * @description 防抖函数
 * @param {Function} callback 回调方法
 * @param {Number} [ms = 200] 防抖延迟
 * @return {Function}
 */
export function debounce(callback, ms = 200) {
    let timer = null;
    return function (...args) {
        clearTimeout(timer);
        timer = setTimeout(() => {
            callback.apply(this, args);
        }, ms);
    };
}

/**
 * @method throttle
 * @description 节流函数
 * @param {Function} callback 回调方法
 * @param {Number} [ms = 200] 节流间接时间
 * @return {Function}
 */

export function throttle(callback, ms = 200) {
    let canRun = true;
    return function (...args) {
        if (!canRun) {
            return false;
        }
        canRun = false;
        callback.apply(this, args);
        setTimeout(() => {
            canRun = true;
        }, ms);
    };
}

/**
 * @method pointAngle
 * @description 获取两个坐标点之间的角度
 * @param {Object} start 第一个点坐标
 * @param {Number} start.x
 * @param {Number} start.y
 * @param {Object} end 第二个点坐标
 * @param {Number} end.x
 * @param {Number} end.y
 * @return {Number}
 */
export function pointAngle({ x: startX, y: startY }, { x: moveX, y: moveY }) {
    const absX = Math.abs(startX - moveX);
    const abxY = Math.abs(startY - moveY);

    // x 轴之差为 0
    if (absX === 0) {
        return 90;
    }

    // y 轴之差为 0
    if (abxY === 0) {
        return 0;
    }

    let angle = (Math.atan(abxY / absX) * 360) / (2 * Math.PI);

    return angle;
}

/**
 * @method randomColor
 * @description 生成随机HEX色值
 * @return {String}
 */
export function randomColor() {
    return (
        "#" +
        Math.floor(Math.random() * 0xffffff)
            .toString(16)
            .padEnd(6, "0")
    );
}

/**
 * @method starScore
 * @description 生成星级评分
 * @param {Number} rate:(1-5)
 * @return {String}
 */
export function starScore(rate) {
    return "★★★★★☆☆☆☆☆".slice(5 - rate, 10 - rate);
}