/**
 * 防抖函数（在指定时间内，如果事件被频繁触发，则只有在最后一次触发后指定的时间间隔内没有再次触发时，才执行函数）
 */
export function debounce(func, delay) {
    let timer; // 用于存储定时器的标识符
    return function (...args) {
        // 每次触发事件时，清除之前的定时器
        clearTimeout(timer);
        // 设置新的定时器
        timer = setTimeout(() => {
            func.apply(this, args); // 执行目标函数
        }, delay);
    };
}

/**
 * 节流函数（在指定时间内，无论事件触发多少次，只执行一次函数）
 */
export function throttle(func, limit) {
    let inThrottle;
    return function (...args) {
        if (!inThrottle) {
            func.apply(this, args);
            inThrottle = true;
            setTimeout(() => {
                inThrottle = false;
            }, limit);
        }
    };
}

/*
* 找出两个对象之间的不同点
* */
export function findDifferences(oldData, newData) {
    // 创建一个结果对象来存储不同的键值对
    const differences = {};

    // 获取两个对象的所有键
    const keys = new Set([...Object.keys(oldData), ...Object.keys(newData)]);

    // 遍历所有键
    keys.forEach((key) => {
        // 检查两个对象中该键的值是否不同
        if (oldData[key] !== newData[key]) {
            differences[key] = newData[key];
        }
    });
    return differences;
}

/*
* 将对象中的数值转换为字符串
* */
export function convertNumbersToStringAndRemoveNulls(obj) {
    const result = {};
    for (const key in obj) {
        if (obj.hasOwnProperty(key)) {
            const value = obj[key];
            // 如果值为 null，跳过该属性
            if (value === null) {
                continue;
            }
            // 检查值是否为数字
            if (typeof value === 'number') {
                result[key] = value.toString();
            } else {
                result[key] = value;
            }
        }
    }
    return result;
}

/*
* 参数编码拼接
* */
export function appendParamsToPath(path, params) {
    // 创建一个 URLSearchParams 对象
    const searchParams = new URLSearchParams();

    // 遍历参数对象，将每个键值对添加到 URLSearchParams 中
    for (const key in params) {
        if (params.hasOwnProperty(key)) {
            const value = params[key];
            // 对值进行编码
            searchParams.append(key, encodeURIComponent(value));
        }
    }

    // 将查询字符串拼接到路径后面
    const queryString = searchParams.toString();
    return `${path}?${queryString}`;
}
