mahmud-js-tools
Version:
一个简单而实用的JavaScript工具库,包含多种常用的工具函数。
204 lines (184 loc) • 4.88 kB
JavaScript
/**
* js-booster - Utility functions
* @version 1.1.1
* @license MIT
*/
/**
* Deep clone an object
* @param {Object} obj Object to clone
* @returns {Object} Deep cloned object
*/
function deepClone(obj) {
if (obj === null || typeof obj !== 'object') return obj;
if (obj instanceof Date) return new Date(obj);
if (obj instanceof RegExp) return new RegExp(obj);
const clone = Array.isArray(obj) ? [] : {};
for (const key in obj) {
if (Object.prototype.hasOwnProperty.call(obj, key)) {
clone[key] = deepClone(obj[key]);
}
}
return clone;
}
/**
* Clone an array
* @param {Array} arr Array to clone
* @returns {Array} Cloned array
*/
function cloneArray(arr) {
return arr.slice();
}
/**
* Debounce function
* @param {Function} func Function to debounce
* @param {number} delay Delay in milliseconds
* @returns {Function} Debounced function
*/
function debounce(func, delay) {
let timeoutId;
return function(...args) {
clearTimeout(timeoutId);
timeoutId = setTimeout(() => func.apply(this, args), delay);
};
}
/**
* Throttle function
* @param {Function} func Function to throttle
* @param {number} limit Time limit in milliseconds
* @returns {Function} Throttled function
*/
function throttle(func, limit) {
let lastFunc;
let lastRan;
return function(...args) {
if (!lastRan) {
func.apply(this, args);
lastRan = Date.now();
} else {
clearTimeout(lastFunc);
lastFunc = setTimeout(() => {
if (Date.now() - lastRan >= limit) {
func.apply(this, args);
lastRan = Date.now();
}
}, limit - (Date.now() - lastRan));
}
};
}
/**
* Deep equality check
* @param {*} a First value
* @param {*} b Second value
* @returns {boolean} True if deeply equal
*/
function isEqual(a, b) {
if (a === b) return true;
if (typeof a !== 'object' || typeof b !== 'object' || a === null || b === null) return false;
const keysA = Object.keys(a);
const keysB = Object.keys(b);
if (keysA.length !== keysB.length) return false;
for (const key of keysA) {
if (!keysB.includes(key) || !isEqual(a[key], b[key])) return false;
}
return true;
}
/**
* Generate random number in range
* @param {number} min Minimum value
* @param {number} max Maximum value
* @returns {number} Random number
*/
function random(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
/**
* Format timestamp to readable string
* @param {Date|number|string} time Input time
* @param {string} format Format string (default: 'YYYY-MM-DD HH:mm:ss')
* @returns {string} Formatted time string
*/
function formatTime(time, format = 'YYYY-MM-DD HH:mm:ss') {
const date = new Date(time);
const map = {
'YYYY': date.getFullYear(),
'MM': String(date.getMonth() + 1).padStart(2, '0'),
'DD': String(date.getDate()).padStart(2, '0'),
'HH': String(date.getHours()).padStart(2, '0'),
'mm': String(date.getMinutes()).padStart(2, '0'),
'ss': String(date.getSeconds()).padStart(2, '0'),
};
return format.replace(/YYYY|MM|DD|HH|mm|ss/g, matched => map[matched]);
}
/**
* Check if string is a valid URL
* @param {string} str String to check
* @returns {boolean} True if valid URL
*/
function isUrl(str) {
try {
new URL(str);
return true;
} catch {
return false;
}
}
/**
* Remove duplicates from array
* @param {Array} arr Input array
* @returns {Array} Array with unique values
*/
function unique(arr) {
return [...new Set(arr)];
}
/**
* Capitalize first letter of string
* @param {string} str Input string
* @returns {string} Capitalized string
*/
function capitalize(str) {
return str.charAt(0).toUpperCase() + str.slice(1);
}
/**
* Convert string to camelCase
* @param {string} str Input string
* @returns {string} camelCase string
*/
function camelCase(str) {
return str.replace(/[-_\s]+(.)?/g, (_, c) => c ? c.toUpperCase() : '');
}
/**
* Shuffle array (Fisher-Yates algorithm)
* @param {Array} arr Array to shuffle
* @returns {Array} Shuffled array
*/
function shuffle(arr) {
const array = [...arr];
for (let i = array.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[array[i], array[j]] = [array[j], array[i]];
}
return array;
}
/**
* Sleep for specified time
* @param {number} ms Time in milliseconds
* @returns {Promise} Promise that resolves after delay
*/
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
export {
deepClone,
cloneArray,
debounce,
isEqual,
throttle,
random,
formatTime,
isUrl,
unique,
capitalize,
camelCase,
shuffle,
sleep
};