 | |  |  | AIWROK安卓苹果平台设计的实用工具库
- //🍎交流QQ群711841924群一,苹果内测群,528816639
- /**
- * =============================================================================
- * AIWROK 核心工具库完整示例
- * =============================================================================
- * 基于 JavaScript ES5 标准,专为 AIWROK 平台设计的实用工具库
- * 包含:对象操作、数组处理、字符串工具、数学计算、数字处理、时间管理
- *
- * 兼容性:Rhino 引擎 (ES5)
- * 平台:AIWROK 安卓自动化软件
- * 版本:2.0.0
- * =============================================================================
- */
- // =============================================================================
- // 第一部分:对象操作工具类 (ObjectUtils)
- // =============================================================================
- /**
- * 对象操作工具类
- * 提供对象创建、合并、克隆、属性操作等高级功能
- */
- var ObjectUtils = {
-
- /**
- * 深度合并多个对象
- * @param {Object} target - 目标对象
- * @param {...Object} sources - 源对象列表
- * @returns {Object} 合并后的对象
- */
- deepMerge: function(target) {
- var sources = Array.prototype.slice.call(arguments, 1);
- for (var i = 0; i < sources.length; i++) {
- var source = sources[i];
- if (source && typeof source === 'object') {
- for (var key in source) {
- if (source.hasOwnProperty(key)) {
- if (typeof source[key] === 'object' && source[key] !== null && !Array.isArray(source[key])) {
- target[key] = this.deepMerge(target[key] || {}, source[key]);
- } else {
- target[key] = source[key];
- }
- }
- }
- }
- }
- return target;
- },
-
- /**
- * 创建对象的深度克隆
- * @param {Object} obj - 要克隆的对象
- * @returns {Object} 克隆后的新对象
- */
- deepClone: function(obj) {
- if (obj === null || typeof obj !== 'object') {
- return obj;
- }
- if (Array.isArray(obj)) {
- var arrCopy = [];
- for (var i = 0; i < obj.length; i++) {
- arrCopy[i] = this.deepClone(obj[i]);
- }
- return arrCopy;
- }
- var objCopy = {};
- for (var key in obj) {
- if (obj.hasOwnProperty(key)) {
- objCopy[key] = this.deepClone(obj[key]);
- }
- }
- return objCopy;
- },
-
- /**
- * 安全获取嵌套对象属性
- * @param {Object} obj - 目标对象
- * @param {string} path - 属性路径,如 "a.b.c"
- * @param {*} defaultValue - 默认值
- * @returns {*} 属性值或默认值
- */
- getSafe: function(obj, path, defaultValue) {
- if (!obj || !path) return defaultValue;
- var keys = path.split('.');
- var current = obj;
- for (var i = 0; i < keys.length; i++) {
- if (current === null || current === undefined || !current.hasOwnProperty(keys[i])) {
- return defaultValue;
- }
- current = current[keys[i]];
- }
- return current !== undefined ? current : defaultValue;
- },
-
- /**
- * 安全设置嵌套对象属性
- * @param {Object} obj - 目标对象
- * @param {string} path - 属性路径
- * @param {*} value - 要设置的值
- */
- setSafe: function(obj, path, value) {
- if (!obj || !path) return;
- var keys = path.split('.');
- var current = obj;
- for (var i = 0; i < keys.length - 1; i++) {
- if (!current[keys[i]] || typeof current[keys[i]] !== 'object') {
- current[keys[i]] = {};
- }
- current = current[keys[i]];
- }
- current[keys[keys.length - 1]] = value;
- },
-
- /**
- * 过滤对象属性
- * @param {Object} obj - 源对象
- * @param {Array} keys - 要保留的键名数组
- * @returns {Object} 过滤后的对象
- */
- pick: function(obj, keys) {
- var result = {};
- for (var i = 0; i < keys.length; i++) {
- var key = keys[i];
- if (obj.hasOwnProperty(key)) {
- result[key] = obj[key];
- }
- }
- return result;
- },
-
- /**
- * 排除对象属性
- * @param {Object} obj - 源对象
- * @param {Array} keys - 要排除的键名数组
- * @returns {Object} 处理后的对象
- */
- omit: function(obj, keys) {
- var result = {};
- var excludeMap = {};
- for (var i = 0; i < keys.length; i++) {
- excludeMap[keys[i]] = true;
- }
- for (var key in obj) {
- if (obj.hasOwnProperty(key) && !excludeMap[key]) {
- result[key] = obj[key];
- }
- }
- return result;
- },
-
- /**
- * 检查对象是否为空
- * @param {Object} obj - 要检查的对象
- * @returns {boolean} 是否为空
- */
- isEmpty: function(obj) {
- if (!obj) return true;
- for (var key in obj) {
- if (obj.hasOwnProperty(key)) return false;
- }
- return true;
- },
-
- /**
- * 将对象转换为查询字符串
- * @param {Object} obj - 要转换的对象
- * @returns {string} 查询字符串
- */
- toQueryString: function(obj) {
- var pairs = [];
- for (var key in obj) {
- if (obj.hasOwnProperty(key)) {
- pairs.push(encodeURIComponent(key) + '=' + encodeURIComponent(obj[key]));
- }
- }
- return pairs.join('&');
- },
-
- /**
- * 将查询字符串转换为对象
- * @param {string} queryString - 查询字符串
- * @returns {Object} 转换后的对象
- */
- fromQueryString: function(queryString) {
- var result = {};
- if (!queryString) return result;
- var pairs = queryString.split('&');
- for (var i = 0; i < pairs.length; i++) {
- var pair = pairs[i].split('=');
- if (pair.length === 2) {
- result[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);
- }
- }
- return result;
- }
- };
- // =============================================================================
- // 第二部分:数组操作工具类 (ArrayUtils)
- // =============================================================================
- /**
- * 数组操作工具类
- * 提供数组遍历、过滤、排序、分组等高级功能
- */
- var ArrayUtils = {
-
- /**
- * 数组去重
- * @param {Array} arr - 源数组
- * @returns {Array} 去重后的数组
- */
- unique: function(arr) {
- var result = [];
- var seen = {};
- for (var i = 0; i < arr.length; i++) {
- var item = arr[i];
- var key = typeof item + JSON.stringify(item);
- if (!seen[key]) {
- seen[key] = true;
- result.push(item);
- }
- }
- return result;
- },
-
- /**
- * 根据条件过滤数组
- * @param {Array} arr - 源数组
- * @param {Function} predicate - 过滤条件函数
- * @returns {Array} 过滤后的数组
- */
- filter: function(arr, predicate) {
- var result = [];
- for (var i = 0; i < arr.length; i++) {
- if (predicate(arr[i], i, arr)) {
- result.push(arr[i]);
- }
- }
- return result;
- },
-
- /**
- * 数组映射转换
- * @param {Array} arr - 源数组
- * @param {Function} mapper - 映射函数
- * @returns {Array} 转换后的数组
- */
- map: function(arr, mapper) {
- var result = [];
- for (var i = 0; i < arr.length; i++) {
- result.push(mapper(arr[i], i, arr));
- }
- return result;
- },
-
- /**
- * 数组归约计算
- * @param {Array} arr - 源数组
- * @param {Function} reducer - 归约函数
- * @param {*} initialValue - 初始值
- * @returns {*} 归约结果
- */
- reduce: function(arr, reducer, initialValue) {
- var accumulator = initialValue;
- var startIndex = 0;
- if (arguments.length < 3) {
- accumulator = arr[0];
- startIndex = 1;
- }
- for (var i = startIndex; i < arr.length; i++) {
- accumulator = reducer(accumulator, arr[i], i, arr);
- }
- return accumulator;
- },
-
- /**
- * 查找数组元素
- * @param {Array} arr - 源数组
- * @param {Function} predicate - 查找条件
- * @returns {*} 找到的元素或 undefined
- */
- find: function(arr, predicate) {
- for (var i = 0; i < arr.length; i++) {
- if (predicate(arr[i], i, arr)) {
- return arr[i];
- }
- }
- return undefined;
- },
-
- /**
- * 检查数组是否包含某元素
- * @param {Array} arr - 源数组
- * @param {*} item - 要查找的元素
- * @returns {boolean} 是否包含
- */
- includes: function(arr, item) {
- for (var i = 0; i < arr.length; i++) {
- if (arr[i] === item) {
- return true;
- }
- }
- return false;
- },
-
- /**
- * 数组扁平化
- * @param {Array} arr - 源数组
- * @param {number} depth - 扁平化深度,默认为1
- * @returns {Array} 扁平化后的数组
- */
- flatten: function(arr, depth) {
- depth = depth || 1;
- var result = [];
- for (var i = 0; i < arr.length; i++) {
- if (Array.isArray(arr[i]) && depth > 0) {
- result = result.concat(this.flatten(arr[i], depth - 1));
- } else {
- result.push(arr[i]);
- }
- }
- return result;
- },
-
- /**
- * 数组分块
- * @param {Array} arr - 源数组
- * @param {number} size - 每块大小
- * @returns {Array} 分块后的数组
- */
- chunk: function(arr, size) {
- var result = [];
- for (var i = 0; i < arr.length; i += size) {
- var chunk = [];
- for (var j = i; j < i + size && j < arr.length; j++) {
- chunk.push(arr[j]);
- }
- result.push(chunk);
- }
- return result;
- },
-
- /**
- * 数组排序(支持多字段排序)
- * @param {Array} arr - 源数组
- * @param {string|Array} fields - 排序字段
- * @param {string|Array} orders - 排序方式 ('asc' 或 'desc')
- * @returns {Array} 排序后的数组
- */
- orderBy: function(arr, fields, orders) {
- if (!Array.isArray(fields)) {
- fields = [fields];
- }
- if (!Array.isArray(orders)) {
- orders = [orders || 'asc'];
- }
- return arr.slice().sort(function(a, b) {
- for (var i = 0; i < fields.length; i++) {
- var field = fields[i];
- var order = orders[i] || 'asc';
- var aVal = a[field];
- var bVal = b[field];
- if (aVal < bVal) return order === 'asc' ? -1 : 1;
- if (aVal > bVal) return order === 'asc' ? 1 : -1;
- }
- return 0;
- });
- },
-
- /**
- * 数组分组
- * @param {Array} arr - 源数组
- * @param {Function|string} grouper - 分组依据(函数或属性名)
- * @returns {Object} 分组后的对象
- */
- groupBy: function(arr, grouper) {
- var result = {};
- var isFunction = typeof grouper === 'function';
- for (var i = 0; i < arr.length; i++) {
- var key = isFunction ? grouper(arr[i], i, arr) : arr[i][grouper];
- if (!result[key]) {
- result[key] = [];
- }
- result[key].push(arr[i]);
- }
- return result;
- },
-
- /**
- * 从数组中随机取一个元素
- * @param {Array} arr - 源数组
- * @returns {*} 随机元素
- */
- sample: function(arr) {
- if (arr.length === 0) return undefined;
- return arr[Math.floor(Math.random() * arr.length)];
- },
-
- /**
- * 打乱数组顺序(Fisher-Yates算法)
- * @param {Array} arr - 源数组
- * @returns {Array} 打乱后的数组
- */
- shuffle: function(arr) {
- var result = arr.slice();
- for (var i = result.length - 1; i > 0; i--) {
- var j = Math.floor(Math.random() * (i + 1));
- var temp = result[i];
- result[i] = result[j];
- result[j] = temp;
- }
- return result;
- }
- };
- // =============================================================================
- // 第三部分:字符串操作工具类 (StringUtils)
- // =============================================================================
- /**
- * 字符串操作工具类
- * 提供字符串格式化、验证、转换等高级功能
- */
- var StringUtils = {
-
- /**
- * 检查字符串是否为空或空白
- * @param {string} str - 要检查的字符串
- * @returns {boolean} 是否为空
- */
- isEmpty: function(str) {
- return !str || str.trim().length === 0;
- },
-
- /**
- * 字符串反转
- * @param {string} str - 源字符串
- * @returns {string} 反转后的字符串
- */
- reverse: function(str) {
- return str.split('').reverse().join('');
- },
-
- /**
- * 截取字符串(支持负数索引)
- * @param {string} str - 源字符串
- * @param {number} start - 开始位置
- * @param {number} end - 结束位置
- * @returns {string} 截取后的字符串
- */
- slice: function(str, start, end) {
- var len = str.length;
- start = start < 0 ? Math.max(0, len + start) : Math.min(start, len);
- end = end === undefined ? len : (end < 0 ? Math.max(0, len + end) : Math.min(end, len));
- var result = '';
- for (var i = start; i < end; i++) {
- result += str[i];
- }
- return result;
- },
-
- /**
- * 填充字符串到指定长度
- * @param {string} str - 源字符串
- * @param {number} length - 目标长度
- * @param {string} chars - 填充字符
- * @param {boolean} left - 是否左填充
- * @returns {string} 填充后的字符串
- */
- pad: function(str, length, chars, left) {
- chars = chars || ' ';
- if (str.length >= length) return str;
- var padLength = length - str.length;
- var padStr = '';
- while (padStr.length < padLength) {
- padStr += chars;
- }
- padStr = this.slice(padStr, 0, padLength);
- return left ? padStr + str : str + padStr;
- },
-
- /**
- * 左填充字符串
- * @param {string} str - 源字符串
- * @param {number} length - 目标长度
- * @param {string} chars - 填充字符
- * @returns {string} 填充后的字符串
- */
- padStart: function(str, length, chars) {
- return this.pad(str, length, chars, true);
- },
-
- /**
- * 右填充字符串
- * @param {string} str - 源字符串
- * @param {number} length - 目标长度
- * @param {string} chars - 填充字符
- * @returns {string} 填充后的字符串
- */
- padEnd: function(str, length, chars) {
- return this.pad(str, length, chars, false);
- },
-
- /**
- * 重复字符串
- * @param {string} str - 源字符串
- * @param {number} count - 重复次数
- * @returns {string} 重复后的字符串
- */
- repeat: function(str, count) {
- if (count < 0) return '';
- var result = '';
- for (var i = 0; i < count; i++) {
- result += str;
- }
- return result;
- },
-
- /**
- * 截断字符串并添加省略号
- * @param {string} str - 源字符串
- * @param {number} length - 最大长度
- * @param {string} omission - 省略符号
- * @returns {string} 截断后的字符串
- */
- truncate: function(str, length, omission) {
- omission = omission || '...';
- if (str.length <= length) return str;
- return this.slice(str, 0, length - omission.length) + omission;
- },
-
- /**
- * 驼峰命名转下划线命名
- * @param {string} str - 驼峰命名字符串
- * @returns {string} 下划线命名字符串
- */
- camelToSnake: function(str) {
- return str.replace(/([A-Z])/g, '_$1').toLowerCase().replace(/^_/, '');
- },
-
- /**
- * 下划线命名转驼峰命名
- * @param {string} str - 下划线命名字符串
- * @returns {string} 驼峰命名字符串
- */
- snakeToCamel: function(str) {
- return str.replace(/_([a-z])/g, function(match, letter) {
- return letter.toUpperCase();
- });
- },
-
- /**
- * 首字母大写
- * @param {string} str - 源字符串
- * @returns {string} 处理后的字符串
- */
- capitalize: function(str) {
- if (this.isEmpty(str)) return str;
- return str[0].toUpperCase() + this.slice(str, 1).toLowerCase();
- },
-
- /**
- * 检查字符串是否以指定前缀开头
- * @param {string} str - 源字符串
- * @param {string} prefix - 前缀
- * @returns {boolean} 是否以该前缀开头
- */
- startsWith: function(str, prefix) {
- if (prefix.length > str.length) return false;
- return this.slice(str, 0, prefix.length) === prefix;
- },
-
- /**
- * 检查字符串是否以指定后缀结尾
- * @param {string} str - 源字符串
- * @param {string} suffix - 后缀
- * @returns {boolean} 是否以该后缀结尾
- */
- endsWith: function(str, suffix) {
- if (suffix.length > str.length) return false;
- return this.slice(str, str.length - suffix.length) === suffix;
- },
-
- /**
- * 移除字符串中的空白字符
- * @param {string} str - 源字符串
- * @returns {string} 处理后的字符串
- */
- removeWhitespace: function(str) {
- var result = '';
- for (var i = 0; i < str.length; i++) {
- if (str[i] !== ' ' && str[i] !== '\t' && str[i] !== '\n' && str[i] !== '\r') {
- result += str[i];
- }
- }
- return result;
- },
-
- /**
- * 统计字符出现次数
- * @param {string} str - 源字符串
- * @param {string} char - 要统计的字符
- * @returns {number} 出现次数
- */
- countChar: function(str, char) {
- var count = 0;
- for (var i = 0; i < str.length; i++) {
- if (str[i] === char) count++;
- }
- return count;
- },
-
- /**
- * 生成随机字符串
- * @param {number} length - 字符串长度
- * @param {string} chars - 字符集
- * @returns {string} 随机字符串
- */
- random: function(length, chars) {
- chars = chars || 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
- var result = '';
- for (var i = 0; i < length; i++) {
- result += chars.charAt(Math.floor(Math.random() * chars.length));
- }
- return result;
- }
- };
- // =============================================================================
- // 第四部分:数学计算工具类 (MathUtils)
- // =============================================================================
- /**
- * 数学计算工具类
- * 提供数值计算、随机数生成、几何计算等高级功能
- */
- var MathUtils = {
-
- /**
- * 角度转弧度
- * @param {number} degrees - 角度值
- * @returns {number} 弧度值
- */
- toRadians: function(degrees) {
- return degrees * (Math.PI / 180);
- },
-
- /**
- * 弧度转角度
- * @param {number} radians - 弧度值
- * @returns {number} 角度值
- */
- toDegrees: function(radians) {
- return radians * (180 / Math.PI);
- },
-
- /**
- * 限制数值在指定范围内
- * @param {number} value - 要限制的数值
- * @param {number} min - 最小值
- * @param {number} max - 最大值
- * @returns {number} 限制后的数值
- */
- clamp: function(value, min, max) {
- return Math.min(Math.max(value, min), max);
- },
-
- /**
- * 线性插值
- * @param {number} start - 起始值
- * @param {number} end - 结束值
- * @param {number} t - 插值系数 (0-1)
- * @returns {number} 插值结果
- */
- lerp: function(start, end, t) {
- return start + (end - start) * t;
- },
-
- /**
- * 两点间距离
- * @param {number} x1 - 第一点X坐标
- * @param {number} y1 - 第一点Y坐标
- * @param {number} x2 - 第二点X坐标
- * @param {number} y2 - 第二点Y坐标
- * @returns {number} 距离
- */
- distance: function(x1, y1, x2, y2) {
- var dx = x2 - x1;
- var dy = y2 - y1;
- return Math.sqrt(dx * dx + dy * dy);
- },
-
- /**
- * 计算两点间角度
- * @param {number} x1 - 第一点X坐标
- * @param {number} y1 - 第一点Y坐标
- * @param {number} x2 - 第二点X坐标
- * @param {number} y2 - 第二点Y坐标
- * @returns {number} 角度(度)
- */
- angle: function(x1, y1, x2, y2) {
- return this.toDegrees(Math.atan2(y2 - y1, x2 - x1));
- },
-
- /**
- * 生成指定范围内的随机整数
- * @param {number} min - 最小值(包含)
- * @param {number} max - 最大值(包含)
- * @returns {number} 随机整数
- */
- randomInt: function(min, max) {
- return Math.floor(Math.random() * (max - min + 1)) + min;
- },
-
- /**
- * 生成指定范围内的随机浮点数
- * @param {number} min - 最小值
- * @param {number} max - 最大值
- * @returns {number} 随机浮点数
- */
- randomFloat: function(min, max) {
- return Math.random() * (max - min) + min;
- },
-
- /**
- * 判断点是否在矩形内
- * @param {number} px - 点X坐标
- * @param {number} py - 点Y坐标
- * @param {number} rx - 矩形左上角X坐标
- * @param {number} ry - 矩形左上角Y坐标
- * @param {number} rw - 矩形宽度
- * @param {number} rh - 矩形高度
- * @returns {boolean} 是否在矩形内
- */
- pointInRect: function(px, py, rx, ry, rw, rh) {
- return px >= rx && px <= rx + rw && py >= ry && py <= ry + rh;
- },
-
- /**
- * 判断点是否在圆内
- * @param {number} px - 点X坐标
- * @param {number} py - 点Y坐标
- * @param {number} cx - 圆心X坐标
- * @param {number} cy - 圆心Y坐标
- * @param {number} radius - 圆半径
- * @returns {boolean} 是否在圆内
- */
- pointInCircle: function(px, py, cx, cy, radius) {
- return this.distance(px, py, cx, cy) <= radius;
- },
-
- /**
- * 计算平均值
- * @param {...number} numbers - 数值列表
- * @returns {number} 平均值
- */
- average: function() {
- var sum = 0;
- for (var i = 0; i < arguments.length; i++) {
- sum += arguments[i];
- }
- return sum / arguments.length;
- },
-
- /**
- * 计算标准差
- * @param {Array} numbers - 数值数组
- * @returns {number} 标准差
- */
- standardDeviation: function(numbers) {
- var avg = this.average.apply(this, numbers);
- var sumSquaredDiff = 0;
- for (var i = 0; i < numbers.length; i++) {
- var diff = numbers[i] - avg;
- sumSquaredDiff += diff * diff;
- }
- return Math.sqrt(sumSquaredDiff / numbers.length);
- },
-
- /**
- * 判断两个矩形是否相交
- * @param {Object} rect1 - 第一个矩形 {x, y, width, height}
- * @param {Object} rect2 - 第二个矩形 {x, y, width, height}
- * @returns {boolean} 是否相交
- */
- rectIntersect: function(rect1, rect2) {
- return !(rect2.x > rect1.x + rect1.width ||
- rect2.x + rect2.width < rect1.x ||
- rect2.y > rect1.y + rect1.height ||
- rect2.y + rect2.height < rect1.y);
- },
-
- /**
- * 计算阶乘
- * @param {number} n - 非负整数
- * @returns {number} 阶乘结果
- */
- factorial: function(n) {
- if (n < 0) return NaN;
- if (n === 0 || n === 1) return 1;
- var result = 1;
- for (var i = 2; i <= n; i++) {
- result *= i;
- }
- return result;
- },
-
- /**
- * 计算组合数 C(n, k)
- * @param {number} n - 总数
- * @param {number} k - 选取数
- * @returns {number} 组合数
- */
- combination: function(n, k) {
- if (k > n) return 0;
- if (k === 0 || k === n) return 1;
- return this.factorial(n) / (this.factorial(k) * this.factorial(n - k));
- }
- };
- // =============================================================================
- // 第五部分:数字处理工具类 (NumberUtils)
- // =============================================================================
- /**
- * 数字处理工具类
- * 提供数字格式化、转换、验证等高级功能
- */
- var NumberUtils = {
-
- /**
- * 将数字格式化为千分位字符串
- * @param {number} num - 要格式化的数字
- * @param {number} decimals - 小数位数
- * @returns {string} 格式化后的字符串
- */
- formatThousands: function(num, decimals) {
- decimals = decimals !== undefined ? decimals : 2;
- var fixed = num.toFixed(decimals);
- var parts = fixed.split('.');
- var integerPart = parts[0];
- var decimalPart = parts[1] || '';
- var result = '';
- var count = 0;
- for (var i = integerPart.length - 1; i >= 0; i--) {
- result = integerPart[i] + result;
- count++;
- if (count % 3 === 0 && i > 0 && integerPart[i - 1] !== '-') {
- result = ',' + result;
- }
- }
- return decimalPart ? result + '.' + decimalPart : result;
- },
-
- /**
- * 将字节数转换为可读格式
- * @param {number} bytes - 字节数
- * @param {number} decimals - 小数位数
- * @returns {string} 可读格式字符串
- */
- formatBytes: function(bytes, decimals) {
- decimals = decimals !== undefined ? decimals : 2;
- if (bytes === 0) return '0 Bytes';
- var k = 1024;
- var sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];
- var i = Math.floor(Math.log(bytes) / Math.log(k));
- return parseFloat((bytes / Math.pow(k, i)).toFixed(decimals)) + ' ' + sizes[i];
- },
-
- /**
- * 将毫秒转换为可读时间
- * @param {number} ms - 毫秒数
- * @returns {string} 可读时间字符串
- */
- formatDuration: function(ms) {
- if (ms < 1000) return ms + 'ms';
- var seconds = Math.floor(ms / 1000);
- if (seconds < 60) return seconds + 's';
- var minutes = Math.floor(seconds / 60);
- if (minutes < 60) return minutes + 'm ' + (seconds % 60) + 's';
- var hours = Math.floor(minutes / 60);
- return hours + 'h ' + (minutes % 60) + 'm';
- },
-
- /**
- * 检查是否为整数
- * @param {*} value - 要检查的值
- * @returns {boolean} 是否为整数
- */
- isInteger: function(value) {
- return typeof value === 'number' && isFinite(value) && Math.floor(value) === value;
- },
-
- /**
- * 检查是否为数字
- * @param {*} value - 要检查的值
- * @returns {boolean} 是否为数字
- */
- isNumber: function(value) {
- return typeof value === 'number' && isFinite(value);
- },
-
- /**
- * 将字符串转换为数字
- * @param {string} str - 要转换的字符串
- * @param {*} defaultValue - 转换失败时的默认值
- * @returns {number} 转换后的数字
- */
- toNumber: function(str, defaultValue) {
- var num = parseFloat(str);
- return isNaN(num) ? defaultValue : num;
- },
-
- /**
- * 将数字转换为中文大写金额
- * @param {number} num - 要转换的数字
- * @returns {string} 中文大写金额
- */
- toChineseMoney: function(num) {
- var units = ['', '十', '百', '千'];
- var bigUnits = ['', '万', '亿'];
- var digits = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九'];
-
- if (num === 0) return '零';
- if (num < 0) return '负' + this.toChineseMoney(-num);
-
- var strNum = Math.floor(num).toString();
- var result = '';
- var zeroCount = 0;
- var bigUnitIndex = 0;
-
- for (var i = strNum.length - 1; i >= 0; i -= 4) {
- var part = '';
- var partZero = true;
- for (var j = 0; j < 4 && i - j >= 0; j++) {
- var digit = parseInt(strNum[i - j]);
- if (digit === 0) {
- zeroCount++;
- } else {
- if (zeroCount > 0) {
- part = digits[0] + part;
- zeroCount = 0;
- }
- part = digits[digit] + units[j] + part;
- partZero = false;
- }
- }
- if (!partZero) {
- result = part + bigUnits[bigUnitIndex] + result;
- }
- bigUnitIndex++;
- }
-
- return result.replace(/零+/g, '零').replace(/零$/, '');
- },
-
- /**
- * 将数字转换为罗马数字
- * @param {number} num - 要转换的数字 (1-3999)
- * @returns {string} 罗马数字
- */
- toRoman: function(num) {
- if (num < 1 || num > 3999) return '';
- var values = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1];
- var symbols = ['M', 'CM', 'D', 'CD', 'C', 'XC', 'L', 'XL', 'X', 'IX', 'V', 'IV', 'I'];
- var result = '';
- for (var i = 0; i < values.length; i++) {
- while (num >= values[i]) {
- result += symbols[i];
- num -= values[i];
- }
- }
- return result;
- },
-
- /**
- * 将罗马数字转换为数字
- * @param {string} roman - 罗马数字
- * @returns {number} 转换后的数字
- */
- fromRoman: function(roman) {
- var values = {I: 1, V: 5, X: 10, L: 50, C: 100, D: 500, M: 1000};
- var result = 0;
- for (var i = 0; i < roman.length; i++) {
- var current = values[roman[i]];
- var next = values[roman[i + 1]];
- if (next && current < next) {
- result -= current;
- } else {
- result += current;
- }
- }
- return result;
- },
-
- /**
- * 生成指定范围内的随机数数组
- * @param {number} count - 数组长度
- * @param {number} min - 最小值
- * @param {number} max - 最大值
- * @returns {Array} 随机数数组
- */
- randomArray: function(count, min, max) {
- var result = [];
- for (var i = 0; i < count; i++) {
- result.push(MathUtils.randomInt(min, max));
- }
- return result;
- }
- };
- // =============================================================================
- // 第六部分:时间管理工具类 (TimeUtils)
- // =============================================================================
- /**
- * 时间管理工具类
- * 提供日期时间格式化、计算、转换等高级功能
- */
- var TimeUtils = {
-
- /**
- * 格式化日期时间
- * @param {Date} date - 日期对象
- * @param {string} format - 格式字符串 (yyyy-MM-dd HH:mm:ss)
- * @returns {string} 格式化后的字符串
- */
- format: function(date, format) {
- format = format || 'yyyy-MM-dd HH:mm:ss';
- var year = date.getFullYear();
- var month = date.getMonth() + 1;
- var day = date.getDate();
- var hours = date.getHours();
- var minutes = date.getMinutes();
- var seconds = date.getSeconds();
- var milliseconds = date.getMilliseconds();
-
- return format
- .replace(/yyyy/g, year)
- .replace(/MM/g, StringUtils.padStart(month.toString(), 2, '0'))
- .replace(/dd/g, StringUtils.padStart(day.toString(), 2, '0'))
- .replace(/HH/g, StringUtils.padStart(hours.toString(), 2, '0'))
- .replace(/mm/g, StringUtils.padStart(minutes.toString(), 2, '0'))
- .replace(/ss/g, StringUtils.padStart(seconds.toString(), 2, '0'))
- .replace(/SSS/g, StringUtils.padStart(milliseconds.toString(), 3, '0'));
- },
-
- /**
- * 获取当前时间字符串
- * @param {string} format - 格式字符串
- * @returns {string} 当前时间字符串
- */
- now: function(format) {
- return this.format(new Date(), format);
- },
-
- /**
- * 获取今天的开始时间
- * @returns {Date} 今天的开始时间
- */
- startOfDay: function() {
- var date = new Date();
- date.setHours(0, 0, 0, 0);
- return date;
- },
-
- /**
- * 获取今天的结束时间
- * @returns {Date} 今天的结束时间
- */
- endOfDay: function() {
- var date = new Date();
- date.setHours(23, 59, 59, 999);
- return date;
- },
-
- /**
- * 添加时间
- * @param {Date} date - 原日期
- * @param {number} amount - 数量
- * @param {string} unit - 单位 (year, month, day, hour, minute, second)
- * @returns {Date} 新的日期
- */
- add: function(date, amount, unit) {
- var result = new Date(date);
- switch (unit) {
- case 'year':
- result.setFullYear(result.getFullYear() + amount);
- break;
- case 'month':
- result.setMonth(result.getMonth() + amount);
- break;
- case 'day':
- result.setDate(result.getDate() + amount);
- break;
- case 'hour':
- result.setHours(result.getHours() + amount);
- break;
- case 'minute':
- result.setMinutes(result.getMinutes() + amount);
- break;
- case 'second':
- result.setSeconds(result.getSeconds() + amount);
- break;
- }
- return result;
- },
-
- /**
- * 计算两个日期之间的差值
- * @param {Date} date1 - 第一个日期
- * @param {Date} date2 - 第二个日期
- * @param {string} unit - 返回单位 (ms, s, m, h, d)
- * @returns {number} 差值
- */
- diff: function(date1, date2, unit) {
- var diffMs = date2 - date1;
- switch (unit) {
- case 'ms': return diffMs;
- case 's': return Math.floor(diffMs / 1000);
- case 'm': return Math.floor(diffMs / (1000 * 60));
- case 'h': return Math.floor(diffMs / (1000 * 60 * 60));
- case 'd': return Math.floor(diffMs / (1000 * 60 * 60 * 24));
- default: return diffMs;
- }
- },
-
- /**
- * 判断是否为闰年
- * @param {number} year - 年份
- * @returns {boolean} 是否为闰年
- */
- isLeapYear: function(year) {
- return (year % 4 === 0 && year % 100 !== 0) || (year % 400 === 0);
- },
-
- /**
- * 获取月份天数
- * @param {number} year - 年份
- * @param {number} month - 月份 (1-12)
- * @returns {number} 天数
- */
- daysInMonth: function(year, month) {
- var days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
- if (month === 2 && this.isLeapYear(year)) {
- return 29;
- }
- return days[month - 1];
- },
-
- /**
- * 获取日期是星期几
- * @param {Date} date - 日期
- * @returns {string} 星期几
- */
- dayOfWeek: function(date) {
- var days = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];
- return days[date.getDay()];
- },
-
- /**
- * 获取日期是一年中的第几天
- * @param {Date} date - 日期
- * @returns {number} 第几天
- */
- dayOfYear: function(date) {
- var start = new Date(date.getFullYear(), 0, 0);
- var diff = date - start;
- return Math.floor(diff / (1000 * 60 * 60 * 24));
- },
-
- /**
- * 获取日期所在周的起始日期
- * @param {Date} date - 日期
- * @returns {Date} 周起始日期(周一)
- */
- startOfWeek: function(date) {
- var result = new Date(date);
- var day = result.getDay();
- var diff = result.getDate() - day + (day === 0 ? -6 : 1);
- result.setDate(diff);
- result.setHours(0, 0, 0, 0);
- return result;
- },
-
- /**
- * 倒计时格式化
- * @param {number} seconds - 剩余秒数
- * @returns {string} 格式化后的倒计时
- */
- countdown: function(seconds) {
- var hours = Math.floor(seconds / 3600);
- var minutes = Math.floor((seconds % 3600) / 60);
- var secs = seconds % 60;
- return StringUtils.padStart(hours.toString(), 2, '0') + ':' +
- StringUtils.padStart(minutes.toString(), 2, '0') + ':' +
- StringUtils.padStart(secs.toString(), 2, '0');
- },
-
- /**
- * 获取相对时间描述
- * @param {Date} date - 日期
- * @returns {string} 相对时间描述
- */
- fromNow: function(date) {
- var now = new Date();
- var diff = Math.floor((now - date) / 1000);
-
- if (diff < 60) return '刚刚';
- if (diff < 3600) return Math.floor(diff / 60) + '分钟前';
- if (diff < 86400) return Math.floor(diff / 3600) + '小时前';
- if (diff < 604800) return Math.floor(diff / 86400) + '天前';
- return this.format(date, 'yyyy-MM-dd');
- },
-
- /**
- * 解析日期字符串
- * @param {string} str - 日期字符串
- * @returns {Date} 日期对象
- */
- parse: function(str) {
- return new Date(str);
- },
-
- /**
- * 获取时间戳
- * @param {Date} date - 日期对象,默认为当前时间
- * @returns {number} 时间戳
- */
- timestamp: function(date) {
- return (date || new Date()).getTime();
- },
-
- /**
- * 休眠指定毫秒数(阻塞式)
- * @param {number} ms - 毫秒数
- */
- sleep: function(ms) {
- var start = new Date().getTime();
- while (new Date().getTime() - start < ms) {
- // 阻塞等待
- }
- },
-
- /**
- * 生成时间范围数组
- * @param {Date} start - 开始日期
- * @param {Date} end - 结束日期
- * @param {string} unit - 步进单位 (day, week, month)
- * @returns {Array} 日期数组
- */
- range: function(start, end, unit) {
- var result = [];
- var current = new Date(start);
- var endDate = new Date(end);
-
- while (current <= endDate) {
- result.push(new Date(current));
- switch (unit) {
- case 'day':
- current.setDate(current.getDate() + 1);
- break;
- case 'week':
- current.setDate(current.getDate() + 7);
- break;
- case 'month':
- current.setMonth(current.getMonth() + 1);
- break;
- }
- }
- return result;
- }
- };
- // =============================================================================
- // 第七部分:综合演示函数
- // =============================================================================
- /**
- * 延迟函数 - 毫秒
- */
- function delay(ms) {
- var start = new Date().getTime();
- while (new Date().getTime() - start < ms) {}
- }
- /**
- * 运行所有工具类的演示
- */
- function runAllDemos() {
- printl('');
- printl('╔══════════════════════════════════════════════════════════════════╗');
- printl('║ AIWROK 核心工具库完整示例 v2.0 ║');
- printl('╚══════════════════════════════════════════════════════════════════╝');
- printl('');
- delay(800);
-
- demoObjectUtils();
- delay(500);
- demoArrayUtils();
- delay(500);
- demoStringUtils();
- delay(500);
- demoMathUtils();
- delay(500);
- demoNumberUtils();
- delay(500);
- demoTimeUtils();
-
- printl('');
- printl('╔══════════════════════════════════════════════════════════════════╗');
- printl('║ ✓ 所有演示已完成! ║');
- printl('╚══════════════════════════════════════════════════════════════════╝');
- printl('');
- }
- /**
- * 对象操作工具类演示
- */
- function demoObjectUtils() {
- printl('┌──────────────────────────────────────────────────────────────────┐');
- printl('│ ObjectUtils - 对象操作工具类 │');
- printl('└──────────────────────────────────────────────────────────────────┘');
- printl('');
- delay(400);
-
- printl('▶ 1. 深度合并 - 合并多个对象(包含嵌套对象)');
- delay(300);
- var obj1 = { a: 1, b: { c: 2 } };
- var obj2 = { b: { d: 3 }, e: 4 };
- var merged = ObjectUtils.deepMerge({}, obj1, obj2);
- printl(' 源对象1: ' + JSON.stringify(obj1));
- delay(200);
- printl(' 源对象2: ' + JSON.stringify(obj2));
- delay(200);
- printl(' 合并结果: ' + JSON.stringify(merged));
- delay(500);
-
- printl('▶ 2. 深度克隆 - 完整复制对象(包含嵌套对象)');
- delay(300);
- var original = { x: 1, y: { z: 2 } };
- var cloned = ObjectUtils.deepClone(original);
- printl(' 原对象: ' + JSON.stringify(original));
- delay(200);
- printl(' 克隆: ' + JSON.stringify(cloned));
- delay(500);
-
- printl('▶ 3. 安全获取 - 获取嵌套属性,避免报错');
- delay(300);
- var data = { user: { profile: { name: '张三' } } };
- var name = ObjectUtils.getSafe(data, 'user.profile.name', '未知');
- printl(' 数据: { user: { profile: { name: "张三" } } }');
- delay(200);
- printl(' 读取 user.profile.name: ' + name);
- delay(200);
- var noExist = ObjectUtils.getSafe(data, 'user.profile.age', '默认值');
- printl(' 读取 user.profile.age(不存在): ' + noExist);
- delay(500);
-
- printl('▶ 4. 对象转查询字符串');
- delay(300);
- var params = { name: '张三', age: 25 };
- var query = ObjectUtils.toQueryString(params);
- printl(' 对象: ' + JSON.stringify(params));
- delay(200);
- printl(' 查询字符串: ' + query);
- delay(500);
-
- printl('▶ 5. 查询字符串转对象');
- delay(300);
- var parsed = ObjectUtils.fromQueryString(query);
- printl(' 解析结果: ' + JSON.stringify(parsed));
- delay(500);
-
- printl('');
- }
- /**
- * 数组操作工具类演示
- */
- function demoArrayUtils() {
- printl('┌──────────────────────────────────────────────────────────────────┐');
- printl('│ ArrayUtils - 数组操作工具类 │');
- printl('└──────────────────────────────────────────────────────────────────┘');
- printl('');
- delay(400);
-
- printl('▶ 1. 数组去重 - 移除重复元素');
- delay(300);
- var arr1 = [1, 2, 2, 3, 3, 3, 4, 4, 5];
- printl(' 原始数组: ' + JSON.stringify(arr1));
- delay(200);
- var unique = ArrayUtils.unique(arr1);
- printl(' 去重结果: ' + JSON.stringify(unique));
- delay(500);
-
- printl('▶ 2. 数组过滤 - 按条件筛选');
- delay(300);
- var arr2 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
- printl(' 原始数组: ' + JSON.stringify(arr2));
- delay(200);
- var filtered = ArrayUtils.filter(arr2, function(x) { return x > 5; });
- printl(' 过滤条件: x > 5');
- printl(' 过滤结果: ' + JSON.stringify(filtered));
- delay(500);
-
- printl('▶ 3. 数组映射 - 转换每个元素');
- delay(300);
- printl(' 原始数组: ' + JSON.stringify(arr2));
- delay(200);
- var mapped = ArrayUtils.map(arr2, function(x) { return x * 2; });
- printl(' 映射规则: x * 2');
- printl(' 映射结果: ' + JSON.stringify(mapped));
- delay(500);
-
- printl('▶ 4. 数组分块 - 将数组分成多个小块');
- delay(300);
- var arr3 = [1, 2, 3, 4, 5, 6];
- printl(' 原始数组: ' + JSON.stringify(arr3));
- delay(200);
- var chunked = ArrayUtils.chunk(arr3, 2);
- printl(' 分块大小: 2');
- printl(' 分块结果: ' + JSON.stringify(chunked));
- delay(500);
-
- printl('▶ 5. 数组随机取样 - 随机抽取元素');
- delay(300);
- var arr4 = ['苹果', '香蕉', '橙子', '葡萄', '西瓜'];
- printl(' 水果列表: ' + JSON.stringify(arr4));
- delay(200);
- var sample = ArrayUtils.sample(arr4);
- printl(' 随机抽取: ' + sample + ' 🎉');
- delay(500);
-
- printl('');
- }
- /**
- * 字符串操作工具类演示
- */
- function demoStringUtils() {
- printl('┌──────────────────────────────────────────────────────────────────┐');
- printl('│ StringUtils - 字符串操作工具类 │');
- printl('└──────────────────────────────────────────────────────────────────┘');
- printl('');
- delay(400);
-
- printl('▶ 1. 字符串填充 - 补齐位数');
- delay(300);
- var padded = StringUtils.padStart('42', 5, '0');
- printl(' 原字符串: "42"');
- printl(' 目标长度: 5, 填充字符: "0"');
- printl(' 填充结果: "' + padded + '"');
- delay(500);
-
- printl('▶ 2. 字符串截断 - 限制长度');
- delay(300);
- var longText = '这是一段非常长的字符串,需要截断显示';
- printl(' 原文: ' + longText);
- delay(200);
- var truncated = StringUtils.truncate(longText, 15);
- printl(' 截断长度: 15');
- printl(' 截断结果: ' + truncated);
- delay(500);
-
- printl('▶ 3. 驼峰转下划线 - 命名风格转换');
- delay(300);
- var camel = 'userNameAndPassword';
- printl(' 驼峰命名: ' + camel);
- delay(200);
- var snake = StringUtils.camelToSnake(camel);
- printl(' 下划线: ' + snake);
- delay(500);
-
- printl('▶ 4. 首字母大写');
- delay(300);
- var text = 'hello world';
- printl(' 原文: ' + text);
- delay(200);
- var capitalized = StringUtils.capitalize(text);
- printl(' 首字母大写: ' + capitalized);
- delay(500);
-
- printl('▶ 5. 生成随机字符串');
- delay(300);
- var random = StringUtils.random(12);
- printl(' 随机字符串(12位): ' + random);
- delay(500);
-
- printl('');
- }
- /**
- * 数学计算工具类演示
- */
- function demoMathUtils() {
- printl('┌──────────────────────────────────────────────────────────────────┐');
- printl('│ MathUtils - 数学计算工具类 │');
- printl('└──────────────────────────────────────────────────────────────────┘');
- printl('');
- delay(400);
-
- printl('▶ 1. 角度与弧度转换');
- delay(300);
- var degrees = 180;
- printl(' 角度: ' + degrees + '°');
- delay(200);
- var radians = MathUtils.toRadians(degrees);
- printl(' 弧度: ' + radians.toFixed(4));
- delay(500);
-
- printl('▶ 2. 数值范围限制');
- delay(300);
- var testValue = 150;
- printl(' 测试值: ' + testValue);
- delay(200);
- var clamped = MathUtils.clamp(testValue, 0, 100);
- printl(' 限制范围: 0-100');
- printl(' 限制结果: ' + clamped);
- delay(500);
-
- printl('▶ 3. 两点距离计算');
- delay(300);
- var x1 = 0, y1 = 0, x2 = 3, y2 = 4;
- printl(' 点A: (' + x1 + ', ' + y1 + ')');
- printl(' 点B: (' + x2 + ', ' + y2 + ')');
- delay(200);
- var distance = MathUtils.distance(x1, y1, x2, y2);
- printl(' 距离: ' + distance);
- delay(500);
-
- printl('▶ 4. 随机整数生成');
- delay(300);
- var min = 1, max = 100;
- printl(' 范围: ' + min + ' - ' + max);
- delay(200);
- var randomInt = MathUtils.randomInt(min, max);
- printl(' 随机整数: ' + randomInt);
- delay(500);
-
- printl('▶ 5. 计算平均值');
- delay(300);
- var nums = [10, 20, 30, 40, 50];
- printl(' 数字列表: ' + JSON.stringify(nums));
- delay(200);
- var avg = MathUtils.average.apply(null, nums);
- printl(' 平均值: ' + avg);
- delay(500);
-
- printl('');
- }
- /**
- * 数字处理工具类演示
- */
- function demoNumberUtils() {
- printl('┌──────────────────────────────────────────────────────────────────┐');
- printl('│ NumberUtils - 数字处理工具类 │');
- printl('└──────────────────────────────────────────────────────────────────┘');
- printl('');
- delay(400);
-
- printl('▶ 1. 千分位格式化 - 金额显示');
- delay(300);
- var amount = 1234567.89;
- printl(' 原始金额: ' + amount);
- delay(200);
- var formatted = NumberUtils.formatThousands(amount);
- printl(' 格式化后: ¥' + formatted);
- delay(500);
-
- printl('▶ 2. 字节大小格式化 - 文件大小');
- delay(300);
- var fileSize = 1536000;
- printl(' 原始字节: ' + fileSize + ' bytes');
- delay(200);
- var bytes = NumberUtils.formatBytes(fileSize);
- printl(' 格式化后: ' + bytes);
- delay(500);
-
- printl('▶ 3. 时长格式化 - 显示友好的时间');
- delay(300);
- var ms = 3661000;
- printl(' 原始毫秒: ' + ms);
- delay(200);
- var duration = NumberUtils.formatDuration(ms);
- printl(' 格式化后: ' + duration);
- delay(500);
-
- printl('▶ 4. 数字转中文大写 - 金额显示');
- delay(300);
- var money = 12345;
- printl(' 原始数字: ' + money);
- delay(200);
- var chinese = NumberUtils.toChineseMoney(money);
- printl(' 中文大写: ' + chinese);
- delay(500);
-
- printl('▶ 5. 数字转罗马数字');
- delay(300);
- var year = 2024;
- printl(' 原始数字: ' + year);
- delay(200);
- var roman = NumberUtils.toRoman(year);
- printl(' 罗马数字: ' + roman);
- delay(500);
-
- printl('');
- }
- /**
- * 时间管理工具类演示
- */
- function demoTimeUtils() {
- printl('┌──────────────────────────────────────────────────────────────────┐');
- printl('│ TimeUtils - 时间管理工具类 │');
- printl('└──────────────────────────────────────────────────────────────────┘');
- printl('');
- delay(400);
-
- printl('▶ 1. 时间格式化 - 自定义格式显示');
- delay(300);
- var now = new Date();
- printl(' 当前时间: ' + TimeUtils.format(now, 'yyyy-MM-dd HH:mm:ss'));
- delay(200);
- printl(' 简洁格式: ' + TimeUtils.format(now, 'MM/dd HH:mm'));
- delay(500);
-
- printl('▶ 2. 获取星期几');
- delay(300);
- printl(' 今天: ' + TimeUtils.dayOfWeek(now));
- delay(500);
-
- printl('▶ 3. 今年第几天');
- delay(300);
- printl(' 今天是今年第 ' + TimeUtils.dayOfYear(now) + ' 天');
- delay(500);
-
- printl('▶ 4. 倒计时显示');
- delay(300);
- var countdownSeconds = 3665;
- printl(' 原始秒数: ' + countdownSeconds);
- delay(200);
- var countdown = TimeUtils.countdown(countdownSeconds);
- printl(' 倒计时: ' + countdown);
- delay(500);
-
- printl('▶ 5. 日期加减计算');
- delay(300);
- printl(' 今天是: ' + TimeUtils.format(now, 'yyyy-MM-dd'));
- delay(200);
- var future = TimeUtils.add(now, 7, 'day');
- printl(' 7天后: ' + TimeUtils.format(future, 'yyyy-MM-dd'));
- delay(200);
- var past = TimeUtils.add(now, -3, 'day');
- printl(' 3天前: ' + TimeUtils.format(past, 'yyyy-MM-dd'));
- delay(500);
-
- printl('');
- }
- // 主函数入口(由 start.js 调用)
- function runMainDemo() {
- runAllDemos();
- }
- // 注意:不在此处自动运行,由 start.js 控制调用时机
- // 如需直接运行此脚本,取消下面一行的注释
- runMainDemo();
复制代码
| |  | |  |
|