B2B网络软件

标题: AIWROK安卓苹果平台设计的实用工具库 [打印本页]

作者: YYPOST群发软件    时间: 3 小时前
标题: AIWROK安卓苹果平台设计的实用工具库

AIWROK安卓苹果平台设计的实用工具库
AIWROK安卓苹果平台设计的实用工具库 B2B网络软件

AIWROK安卓苹果平台设计的实用工具库 B2B网络软件

AIWROK安卓苹果平台设计的实用工具库 B2B网络软件





  1. //🍎交流QQ群711841924群一,苹果内测群,528816639

  2. /**
  3. * =============================================================================
  4. * AIWROK 核心工具库完整示例
  5. * =============================================================================
  6. * 基于 JavaScript ES5 标准,专为 AIWROK 平台设计的实用工具库
  7. * 包含:对象操作、数组处理、字符串工具、数学计算、数字处理、时间管理
  8. *
  9. * 兼容性:Rhino 引擎 (ES5)
  10. * 平台:AIWROK 安卓自动化软件
  11. * 版本:2.0.0
  12. * =============================================================================
  13. */

  14. // =============================================================================
  15. // 第一部分:对象操作工具类 (ObjectUtils)
  16. // =============================================================================

  17. /**
  18. * 对象操作工具类
  19. * 提供对象创建、合并、克隆、属性操作等高级功能
  20. */
  21. var ObjectUtils = {
  22.    
  23.     /**
  24.      * 深度合并多个对象
  25.      * @param {Object} target - 目标对象
  26.      * @param {...Object} sources - 源对象列表
  27.      * @returns {Object} 合并后的对象
  28.      */
  29.     deepMerge: function(target) {
  30.         var sources = Array.prototype.slice.call(arguments, 1);
  31.         for (var i = 0; i < sources.length; i++) {
  32.             var source = sources[i];
  33.             if (source && typeof source === 'object') {
  34.                 for (var key in source) {
  35.                     if (source.hasOwnProperty(key)) {
  36.                         if (typeof source[key] === 'object' && source[key] !== null && !Array.isArray(source[key])) {
  37.                             target[key] = this.deepMerge(target[key] || {}, source[key]);
  38.                         } else {
  39.                             target[key] = source[key];
  40.                         }
  41.                     }
  42.                 }
  43.             }
  44.         }
  45.         return target;
  46.     },
  47.    
  48.     /**
  49.      * 创建对象的深度克隆
  50.      * @param {Object} obj - 要克隆的对象
  51.      * @returns {Object} 克隆后的新对象
  52.      */
  53.     deepClone: function(obj) {
  54.         if (obj === null || typeof obj !== 'object') {
  55.             return obj;
  56.         }
  57.         if (Array.isArray(obj)) {
  58.             var arrCopy = [];
  59.             for (var i = 0; i < obj.length; i++) {
  60.                 arrCopy[i] = this.deepClone(obj[i]);
  61.             }
  62.             return arrCopy;
  63.         }
  64.         var objCopy = {};
  65.         for (var key in obj) {
  66.             if (obj.hasOwnProperty(key)) {
  67.                 objCopy[key] = this.deepClone(obj[key]);
  68.             }
  69.         }
  70.         return objCopy;
  71.     },
  72.    
  73.     /**
  74.      * 安全获取嵌套对象属性
  75.      * @param {Object} obj - 目标对象
  76.      * @param {string} path - 属性路径,如 "a.b.c"
  77.      * @param {*} defaultValue - 默认值
  78.      * @returns {*} 属性值或默认值
  79.      */
  80.     getSafe: function(obj, path, defaultValue) {
  81.         if (!obj || !path) return defaultValue;
  82.         var keys = path.split('.');
  83.         var current = obj;
  84.         for (var i = 0; i < keys.length; i++) {
  85.             if (current === null || current === undefined || !current.hasOwnProperty(keys[i])) {
  86.                 return defaultValue;
  87.             }
  88.             current = current[keys[i]];
  89.         }
  90.         return current !== undefined ? current : defaultValue;
  91.     },
  92.    
  93.     /**
  94.      * 安全设置嵌套对象属性
  95.      * @param {Object} obj - 目标对象
  96.      * @param {string} path - 属性路径
  97.      * @param {*} value - 要设置的值
  98.      */
  99.     setSafe: function(obj, path, value) {
  100.         if (!obj || !path) return;
  101.         var keys = path.split('.');
  102.         var current = obj;
  103.         for (var i = 0; i < keys.length - 1; i++) {
  104.             if (!current[keys[i]] || typeof current[keys[i]] !== 'object') {
  105.                 current[keys[i]] = {};
  106.             }
  107.             current = current[keys[i]];
  108.         }
  109.         current[keys[keys.length - 1]] = value;
  110.     },
  111.    
  112.     /**
  113.      * 过滤对象属性
  114.      * @param {Object} obj - 源对象
  115.      * @param {Array} keys - 要保留的键名数组
  116.      * @returns {Object} 过滤后的对象
  117.      */
  118.     pick: function(obj, keys) {
  119.         var result = {};
  120.         for (var i = 0; i < keys.length; i++) {
  121.             var key = keys[i];
  122.             if (obj.hasOwnProperty(key)) {
  123.                 result[key] = obj[key];
  124.             }
  125.         }
  126.         return result;
  127.     },
  128.    
  129.     /**
  130.      * 排除对象属性
  131.      * @param {Object} obj - 源对象
  132.      * @param {Array} keys - 要排除的键名数组
  133.      * @returns {Object} 处理后的对象
  134.      */
  135.     omit: function(obj, keys) {
  136.         var result = {};
  137.         var excludeMap = {};
  138.         for (var i = 0; i < keys.length; i++) {
  139.             excludeMap[keys[i]] = true;
  140.         }
  141.         for (var key in obj) {
  142.             if (obj.hasOwnProperty(key) && !excludeMap[key]) {
  143.                 result[key] = obj[key];
  144.             }
  145.         }
  146.         return result;
  147.     },
  148.    
  149.     /**
  150.      * 检查对象是否为空
  151.      * @param {Object} obj - 要检查的对象
  152.      * @returns {boolean} 是否为空
  153.      */
  154.     isEmpty: function(obj) {
  155.         if (!obj) return true;
  156.         for (var key in obj) {
  157.             if (obj.hasOwnProperty(key)) return false;
  158.         }
  159.         return true;
  160.     },
  161.    
  162.     /**
  163.      * 将对象转换为查询字符串
  164.      * @param {Object} obj - 要转换的对象
  165.      * @returns {string} 查询字符串
  166.      */
  167.     toQueryString: function(obj) {
  168.         var pairs = [];
  169.         for (var key in obj) {
  170.             if (obj.hasOwnProperty(key)) {
  171.                 pairs.push(encodeURIComponent(key) + '=' + encodeURIComponent(obj[key]));
  172.             }
  173.         }
  174.         return pairs.join('&');
  175.     },
  176.    
  177.     /**
  178.      * 将查询字符串转换为对象
  179.      * @param {string} queryString - 查询字符串
  180.      * @returns {Object} 转换后的对象
  181.      */
  182.     fromQueryString: function(queryString) {
  183.         var result = {};
  184.         if (!queryString) return result;
  185.         var pairs = queryString.split('&');
  186.         for (var i = 0; i < pairs.length; i++) {
  187.             var pair = pairs[i].split('=');
  188.             if (pair.length === 2) {
  189.                 result[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);
  190.             }
  191.         }
  192.         return result;
  193.     }
  194. };

  195. // =============================================================================
  196. // 第二部分:数组操作工具类 (ArrayUtils)
  197. // =============================================================================

  198. /**
  199. * 数组操作工具类
  200. * 提供数组遍历、过滤、排序、分组等高级功能
  201. */
  202. var ArrayUtils = {
  203.    
  204.     /**
  205.      * 数组去重
  206.      * @param {Array} arr - 源数组
  207.      * @returns {Array} 去重后的数组
  208.      */
  209.     unique: function(arr) {
  210.         var result = [];
  211.         var seen = {};
  212.         for (var i = 0; i < arr.length; i++) {
  213.             var item = arr[i];
  214.             var key = typeof item + JSON.stringify(item);
  215.             if (!seen[key]) {
  216.                 seen[key] = true;
  217.                 result.push(item);
  218.             }
  219.         }
  220.         return result;
  221.     },
  222.    
  223.     /**
  224.      * 根据条件过滤数组
  225.      * @param {Array} arr - 源数组
  226.      * @param {Function} predicate - 过滤条件函数
  227.      * @returns {Array} 过滤后的数组
  228.      */
  229.     filter: function(arr, predicate) {
  230.         var result = [];
  231.         for (var i = 0; i < arr.length; i++) {
  232.             if (predicate(arr[i], i, arr)) {
  233.                 result.push(arr[i]);
  234.             }
  235.         }
  236.         return result;
  237.     },
  238.    
  239.     /**
  240.      * 数组映射转换
  241.      * @param {Array} arr - 源数组
  242.      * @param {Function} mapper - 映射函数
  243.      * @returns {Array} 转换后的数组
  244.      */
  245.     map: function(arr, mapper) {
  246.         var result = [];
  247.         for (var i = 0; i < arr.length; i++) {
  248.             result.push(mapper(arr[i], i, arr));
  249.         }
  250.         return result;
  251.     },
  252.    
  253.     /**
  254.      * 数组归约计算
  255.      * @param {Array} arr - 源数组
  256.      * @param {Function} reducer - 归约函数
  257.      * @param {*} initialValue - 初始值
  258.      * @returns {*} 归约结果
  259.      */
  260.     reduce: function(arr, reducer, initialValue) {
  261.         var accumulator = initialValue;
  262.         var startIndex = 0;
  263.         if (arguments.length < 3) {
  264.             accumulator = arr[0];
  265.             startIndex = 1;
  266.         }
  267.         for (var i = startIndex; i < arr.length; i++) {
  268.             accumulator = reducer(accumulator, arr[i], i, arr);
  269.         }
  270.         return accumulator;
  271.     },
  272.    
  273.     /**
  274.      * 查找数组元素
  275.      * @param {Array} arr - 源数组
  276.      * @param {Function} predicate - 查找条件
  277.      * @returns {*} 找到的元素或 undefined
  278.      */
  279.     find: function(arr, predicate) {
  280.         for (var i = 0; i < arr.length; i++) {
  281.             if (predicate(arr[i], i, arr)) {
  282.                 return arr[i];
  283.             }
  284.         }
  285.         return undefined;
  286.     },
  287.    
  288.     /**
  289.      * 检查数组是否包含某元素
  290.      * @param {Array} arr - 源数组
  291.      * @param {*} item - 要查找的元素
  292.      * @returns {boolean} 是否包含
  293.      */
  294.     includes: function(arr, item) {
  295.         for (var i = 0; i < arr.length; i++) {
  296.             if (arr[i] === item) {
  297.                 return true;
  298.             }
  299.         }
  300.         return false;
  301.     },
  302.    
  303.     /**
  304.      * 数组扁平化
  305.      * @param {Array} arr - 源数组
  306.      * @param {number} depth - 扁平化深度,默认为1
  307.      * @returns {Array} 扁平化后的数组
  308.      */
  309.     flatten: function(arr, depth) {
  310.         depth = depth || 1;
  311.         var result = [];
  312.         for (var i = 0; i < arr.length; i++) {
  313.             if (Array.isArray(arr[i]) && depth > 0) {
  314.                 result = result.concat(this.flatten(arr[i], depth - 1));
  315.             } else {
  316.                 result.push(arr[i]);
  317.             }
  318.         }
  319.         return result;
  320.     },
  321.    
  322.     /**
  323.      * 数组分块
  324.      * @param {Array} arr - 源数组
  325.      * @param {number} size - 每块大小
  326.      * @returns {Array} 分块后的数组
  327.      */
  328.     chunk: function(arr, size) {
  329.         var result = [];
  330.         for (var i = 0; i < arr.length; i += size) {
  331.             var chunk = [];
  332.             for (var j = i; j < i + size && j < arr.length; j++) {
  333.                 chunk.push(arr[j]);
  334.             }
  335.             result.push(chunk);
  336.         }
  337.         return result;
  338.     },
  339.    
  340.     /**
  341.      * 数组排序(支持多字段排序)
  342.      * @param {Array} arr - 源数组
  343.      * @param {string|Array} fields - 排序字段
  344.      * @param {string|Array} orders - 排序方式 ('asc' 或 'desc')
  345.      * @returns {Array} 排序后的数组
  346.      */
  347.     orderBy: function(arr, fields, orders) {
  348.         if (!Array.isArray(fields)) {
  349.             fields = [fields];
  350.         }
  351.         if (!Array.isArray(orders)) {
  352.             orders = [orders || 'asc'];
  353.         }
  354.         return arr.slice().sort(function(a, b) {
  355.             for (var i = 0; i < fields.length; i++) {
  356.                 var field = fields[i];
  357.                 var order = orders[i] || 'asc';
  358.                 var aVal = a[field];
  359.                 var bVal = b[field];
  360.                 if (aVal < bVal) return order === 'asc' ? -1 : 1;
  361.                 if (aVal > bVal) return order === 'asc' ? 1 : -1;
  362.             }
  363.             return 0;
  364.         });
  365.     },
  366.    
  367.     /**
  368.      * 数组分组
  369.      * @param {Array} arr - 源数组
  370.      * @param {Function|string} grouper - 分组依据(函数或属性名)
  371.      * @returns {Object} 分组后的对象
  372.      */
  373.     groupBy: function(arr, grouper) {
  374.         var result = {};
  375.         var isFunction = typeof grouper === 'function';
  376.         for (var i = 0; i < arr.length; i++) {
  377.             var key = isFunction ? grouper(arr[i], i, arr) : arr[i][grouper];
  378.             if (!result[key]) {
  379.                 result[key] = [];
  380.             }
  381.             result[key].push(arr[i]);
  382.         }
  383.         return result;
  384.     },
  385.    
  386.     /**
  387.      * 从数组中随机取一个元素
  388.      * @param {Array} arr - 源数组
  389.      * @returns {*} 随机元素
  390.      */
  391.     sample: function(arr) {
  392.         if (arr.length === 0) return undefined;
  393.         return arr[Math.floor(Math.random() * arr.length)];
  394.     },
  395.    
  396.     /**
  397.      * 打乱数组顺序(Fisher-Yates算法)
  398.      * @param {Array} arr - 源数组
  399.      * @returns {Array} 打乱后的数组
  400.      */
  401.     shuffle: function(arr) {
  402.         var result = arr.slice();
  403.         for (var i = result.length - 1; i > 0; i--) {
  404.             var j = Math.floor(Math.random() * (i + 1));
  405.             var temp = result[i];
  406.             result[i] = result[j];
  407.             result[j] = temp;
  408.         }
  409.         return result;
  410.     }
  411. };

  412. // =============================================================================
  413. // 第三部分:字符串操作工具类 (StringUtils)
  414. // =============================================================================

  415. /**
  416. * 字符串操作工具类
  417. * 提供字符串格式化、验证、转换等高级功能
  418. */
  419. var StringUtils = {
  420.    
  421.     /**
  422.      * 检查字符串是否为空或空白
  423.      * @param {string} str - 要检查的字符串
  424.      * @returns {boolean} 是否为空
  425.      */
  426.     isEmpty: function(str) {
  427.         return !str || str.trim().length === 0;
  428.     },
  429.    
  430.     /**
  431.      * 字符串反转
  432.      * @param {string} str - 源字符串
  433.      * @returns {string} 反转后的字符串
  434.      */
  435.     reverse: function(str) {
  436.         return str.split('').reverse().join('');
  437.     },
  438.    
  439.     /**
  440.      * 截取字符串(支持负数索引)
  441.      * @param {string} str - 源字符串
  442.      * @param {number} start - 开始位置
  443.      * @param {number} end - 结束位置
  444.      * @returns {string} 截取后的字符串
  445.      */
  446.     slice: function(str, start, end) {
  447.         var len = str.length;
  448.         start = start < 0 ? Math.max(0, len + start) : Math.min(start, len);
  449.         end = end === undefined ? len : (end < 0 ? Math.max(0, len + end) : Math.min(end, len));
  450.         var result = '';
  451.         for (var i = start; i < end; i++) {
  452.             result += str[i];
  453.         }
  454.         return result;
  455.     },
  456.    
  457.     /**
  458.      * 填充字符串到指定长度
  459.      * @param {string} str - 源字符串
  460.      * @param {number} length - 目标长度
  461.      * @param {string} chars - 填充字符
  462.      * @param {boolean} left - 是否左填充
  463.      * @returns {string} 填充后的字符串
  464.      */
  465.     pad: function(str, length, chars, left) {
  466.         chars = chars || ' ';
  467.         if (str.length >= length) return str;
  468.         var padLength = length - str.length;
  469.         var padStr = '';
  470.         while (padStr.length < padLength) {
  471.             padStr += chars;
  472.         }
  473.         padStr = this.slice(padStr, 0, padLength);
  474.         return left ? padStr + str : str + padStr;
  475.     },
  476.    
  477.     /**
  478.      * 左填充字符串
  479.      * @param {string} str - 源字符串
  480.      * @param {number} length - 目标长度
  481.      * @param {string} chars - 填充字符
  482.      * @returns {string} 填充后的字符串
  483.      */
  484.     padStart: function(str, length, chars) {
  485.         return this.pad(str, length, chars, true);
  486.     },
  487.    
  488.     /**
  489.      * 右填充字符串
  490.      * @param {string} str - 源字符串
  491.      * @param {number} length - 目标长度
  492.      * @param {string} chars - 填充字符
  493.      * @returns {string} 填充后的字符串
  494.      */
  495.     padEnd: function(str, length, chars) {
  496.         return this.pad(str, length, chars, false);
  497.     },
  498.    
  499.     /**
  500.      * 重复字符串
  501.      * @param {string} str - 源字符串
  502.      * @param {number} count - 重复次数
  503.      * @returns {string} 重复后的字符串
  504.      */
  505.     repeat: function(str, count) {
  506.         if (count < 0) return '';
  507.         var result = '';
  508.         for (var i = 0; i < count; i++) {
  509.             result += str;
  510.         }
  511.         return result;
  512.     },
  513.    
  514.     /**
  515.      * 截断字符串并添加省略号
  516.      * @param {string} str - 源字符串
  517.      * @param {number} length - 最大长度
  518.      * @param {string} omission - 省略符号
  519.      * @returns {string} 截断后的字符串
  520.      */
  521.     truncate: function(str, length, omission) {
  522.         omission = omission || '...';
  523.         if (str.length <= length) return str;
  524.         return this.slice(str, 0, length - omission.length) + omission;
  525.     },
  526.    
  527.     /**
  528.      * 驼峰命名转下划线命名
  529.      * @param {string} str - 驼峰命名字符串
  530.      * @returns {string} 下划线命名字符串
  531.      */
  532.     camelToSnake: function(str) {
  533.         return str.replace(/([A-Z])/g, '_$1').toLowerCase().replace(/^_/, '');
  534.     },
  535.    
  536.     /**
  537.      * 下划线命名转驼峰命名
  538.      * @param {string} str - 下划线命名字符串
  539.      * @returns {string} 驼峰命名字符串
  540.      */
  541.     snakeToCamel: function(str) {
  542.         return str.replace(/_([a-z])/g, function(match, letter) {
  543.             return letter.toUpperCase();
  544.         });
  545.     },
  546.    
  547.     /**
  548.      * 首字母大写
  549.      * @param {string} str - 源字符串
  550.      * @returns {string} 处理后的字符串
  551.      */
  552.     capitalize: function(str) {
  553.         if (this.isEmpty(str)) return str;
  554.         return str[0].toUpperCase() + this.slice(str, 1).toLowerCase();
  555.     },
  556.    
  557.     /**
  558.      * 检查字符串是否以指定前缀开头
  559.      * @param {string} str - 源字符串
  560.      * @param {string} prefix - 前缀
  561.      * @returns {boolean} 是否以该前缀开头
  562.      */
  563.     startsWith: function(str, prefix) {
  564.         if (prefix.length > str.length) return false;
  565.         return this.slice(str, 0, prefix.length) === prefix;
  566.     },
  567.    
  568.     /**
  569.      * 检查字符串是否以指定后缀结尾
  570.      * @param {string} str - 源字符串
  571.      * @param {string} suffix - 后缀
  572.      * @returns {boolean} 是否以该后缀结尾
  573.      */
  574.     endsWith: function(str, suffix) {
  575.         if (suffix.length > str.length) return false;
  576.         return this.slice(str, str.length - suffix.length) === suffix;
  577.     },
  578.    
  579.     /**
  580.      * 移除字符串中的空白字符
  581.      * @param {string} str - 源字符串
  582.      * @returns {string} 处理后的字符串
  583.      */
  584.     removeWhitespace: function(str) {
  585.         var result = '';
  586.         for (var i = 0; i < str.length; i++) {
  587.             if (str[i] !== ' ' && str[i] !== '\t' && str[i] !== '\n' && str[i] !== '\r') {
  588.                 result += str[i];
  589.             }
  590.         }
  591.         return result;
  592.     },
  593.    
  594.     /**
  595.      * 统计字符出现次数
  596.      * @param {string} str - 源字符串
  597.      * @param {string} char - 要统计的字符
  598.      * @returns {number} 出现次数
  599.      */
  600.     countChar: function(str, char) {
  601.         var count = 0;
  602.         for (var i = 0; i < str.length; i++) {
  603.             if (str[i] === char) count++;
  604.         }
  605.         return count;
  606.     },
  607.    
  608.     /**
  609.      * 生成随机字符串
  610.      * @param {number} length - 字符串长度
  611.      * @param {string} chars - 字符集
  612.      * @returns {string} 随机字符串
  613.      */
  614.     random: function(length, chars) {
  615.         chars = chars || 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
  616.         var result = '';
  617.         for (var i = 0; i < length; i++) {
  618.             result += chars.charAt(Math.floor(Math.random() * chars.length));
  619.         }
  620.         return result;
  621.     }
  622. };

  623. // =============================================================================
  624. // 第四部分:数学计算工具类 (MathUtils)
  625. // =============================================================================

  626. /**
  627. * 数学计算工具类
  628. * 提供数值计算、随机数生成、几何计算等高级功能
  629. */
  630. var MathUtils = {
  631.    
  632.     /**
  633.      * 角度转弧度
  634.      * @param {number} degrees - 角度值
  635.      * @returns {number} 弧度值
  636.      */
  637.     toRadians: function(degrees) {
  638.         return degrees * (Math.PI / 180);
  639.     },
  640.    
  641.     /**
  642.      * 弧度转角度
  643.      * @param {number} radians - 弧度值
  644.      * @returns {number} 角度值
  645.      */
  646.     toDegrees: function(radians) {
  647.         return radians * (180 / Math.PI);
  648.     },
  649.    
  650.     /**
  651.      * 限制数值在指定范围内
  652.      * @param {number} value - 要限制的数值
  653.      * @param {number} min - 最小值
  654.      * @param {number} max - 最大值
  655.      * @returns {number} 限制后的数值
  656.      */
  657.     clamp: function(value, min, max) {
  658.         return Math.min(Math.max(value, min), max);
  659.     },
  660.    
  661.     /**
  662.      * 线性插值
  663.      * @param {number} start - 起始值
  664.      * @param {number} end - 结束值
  665.      * @param {number} t - 插值系数 (0-1)
  666.      * @returns {number} 插值结果
  667.      */
  668.     lerp: function(start, end, t) {
  669.         return start + (end - start) * t;
  670.     },
  671.    
  672.     /**
  673.      * 两点间距离
  674.      * @param {number} x1 - 第一点X坐标
  675.      * @param {number} y1 - 第一点Y坐标
  676.      * @param {number} x2 - 第二点X坐标
  677.      * @param {number} y2 - 第二点Y坐标
  678.      * @returns {number} 距离
  679.      */
  680.     distance: function(x1, y1, x2, y2) {
  681.         var dx = x2 - x1;
  682.         var dy = y2 - y1;
  683.         return Math.sqrt(dx * dx + dy * dy);
  684.     },
  685.    
  686.     /**
  687.      * 计算两点间角度
  688.      * @param {number} x1 - 第一点X坐标
  689.      * @param {number} y1 - 第一点Y坐标
  690.      * @param {number} x2 - 第二点X坐标
  691.      * @param {number} y2 - 第二点Y坐标
  692.      * @returns {number} 角度(度)
  693.      */
  694.     angle: function(x1, y1, x2, y2) {
  695.         return this.toDegrees(Math.atan2(y2 - y1, x2 - x1));
  696.     },
  697.    
  698.     /**
  699.      * 生成指定范围内的随机整数
  700.      * @param {number} min - 最小值(包含)
  701.      * @param {number} max - 最大值(包含)
  702.      * @returns {number} 随机整数
  703.      */
  704.     randomInt: function(min, max) {
  705.         return Math.floor(Math.random() * (max - min + 1)) + min;
  706.     },
  707.    
  708.     /**
  709.      * 生成指定范围内的随机浮点数
  710.      * @param {number} min - 最小值
  711.      * @param {number} max - 最大值
  712.      * @returns {number} 随机浮点数
  713.      */
  714.     randomFloat: function(min, max) {
  715.         return Math.random() * (max - min) + min;
  716.     },
  717.    
  718.     /**
  719.      * 判断点是否在矩形内
  720.      * @param {number} px - 点X坐标
  721.      * @param {number} py - 点Y坐标
  722.      * @param {number} rx - 矩形左上角X坐标
  723.      * @param {number} ry - 矩形左上角Y坐标
  724.      * @param {number} rw - 矩形宽度
  725.      * @param {number} rh - 矩形高度
  726.      * @returns {boolean} 是否在矩形内
  727.      */
  728.     pointInRect: function(px, py, rx, ry, rw, rh) {
  729.         return px >= rx && px <= rx + rw && py >= ry && py <= ry + rh;
  730.     },
  731.    
  732.     /**
  733.      * 判断点是否在圆内
  734.      * @param {number} px - 点X坐标
  735.      * @param {number} py - 点Y坐标
  736.      * @param {number} cx - 圆心X坐标
  737.      * @param {number} cy - 圆心Y坐标
  738.      * @param {number} radius - 圆半径
  739.      * @returns {boolean} 是否在圆内
  740.      */
  741.     pointInCircle: function(px, py, cx, cy, radius) {
  742.         return this.distance(px, py, cx, cy) <= radius;
  743.     },
  744.    
  745.     /**
  746.      * 计算平均值
  747.      * @param {...number} numbers - 数值列表
  748.      * @returns {number} 平均值
  749.      */
  750.     average: function() {
  751.         var sum = 0;
  752.         for (var i = 0; i < arguments.length; i++) {
  753.             sum += arguments[i];
  754.         }
  755.         return sum / arguments.length;
  756.     },
  757.    
  758.     /**
  759.      * 计算标准差
  760.      * @param {Array} numbers - 数值数组
  761.      * @returns {number} 标准差
  762.      */
  763.     standardDeviation: function(numbers) {
  764.         var avg = this.average.apply(this, numbers);
  765.         var sumSquaredDiff = 0;
  766.         for (var i = 0; i < numbers.length; i++) {
  767.             var diff = numbers[i] - avg;
  768.             sumSquaredDiff += diff * diff;
  769.         }
  770.         return Math.sqrt(sumSquaredDiff / numbers.length);
  771.     },
  772.    
  773.     /**
  774.      * 判断两个矩形是否相交
  775.      * @param {Object} rect1 - 第一个矩形 {x, y, width, height}
  776.      * @param {Object} rect2 - 第二个矩形 {x, y, width, height}
  777.      * @returns {boolean} 是否相交
  778.      */
  779.     rectIntersect: function(rect1, rect2) {
  780.         return !(rect2.x > rect1.x + rect1.width ||
  781.                  rect2.x + rect2.width < rect1.x ||
  782.                  rect2.y > rect1.y + rect1.height ||
  783.                  rect2.y + rect2.height < rect1.y);
  784.     },
  785.    
  786.     /**
  787.      * 计算阶乘
  788.      * @param {number} n - 非负整数
  789.      * @returns {number} 阶乘结果
  790.      */
  791.     factorial: function(n) {
  792.         if (n < 0) return NaN;
  793.         if (n === 0 || n === 1) return 1;
  794.         var result = 1;
  795.         for (var i = 2; i <= n; i++) {
  796.             result *= i;
  797.         }
  798.         return result;
  799.     },
  800.    
  801.     /**
  802.      * 计算组合数 C(n, k)
  803.      * @param {number} n - 总数
  804.      * @param {number} k - 选取数
  805.      * @returns {number} 组合数
  806.      */
  807.     combination: function(n, k) {
  808.         if (k > n) return 0;
  809.         if (k === 0 || k === n) return 1;
  810.         return this.factorial(n) / (this.factorial(k) * this.factorial(n - k));
  811.     }
  812. };

  813. // =============================================================================
  814. // 第五部分:数字处理工具类 (NumberUtils)
  815. // =============================================================================

  816. /**
  817. * 数字处理工具类
  818. * 提供数字格式化、转换、验证等高级功能
  819. */
  820. var NumberUtils = {
  821.    
  822.     /**
  823.      * 将数字格式化为千分位字符串
  824.      * @param {number} num - 要格式化的数字
  825.      * @param {number} decimals - 小数位数
  826.      * @returns {string} 格式化后的字符串
  827.      */
  828.     formatThousands: function(num, decimals) {
  829.         decimals = decimals !== undefined ? decimals : 2;
  830.         var fixed = num.toFixed(decimals);
  831.         var parts = fixed.split('.');
  832.         var integerPart = parts[0];
  833.         var decimalPart = parts[1] || '';
  834.         var result = '';
  835.         var count = 0;
  836.         for (var i = integerPart.length - 1; i >= 0; i--) {
  837.             result = integerPart[i] + result;
  838.             count++;
  839.             if (count % 3 === 0 && i > 0 && integerPart[i - 1] !== '-') {
  840.                 result = ',' + result;
  841.             }
  842.         }
  843.         return decimalPart ? result + '.' + decimalPart : result;
  844.     },
  845.    
  846.     /**
  847.      * 将字节数转换为可读格式
  848.      * @param {number} bytes - 字节数
  849.      * @param {number} decimals - 小数位数
  850.      * @returns {string} 可读格式字符串
  851.      */
  852.     formatBytes: function(bytes, decimals) {
  853.         decimals = decimals !== undefined ? decimals : 2;
  854.         if (bytes === 0) return '0 Bytes';
  855.         var k = 1024;
  856.         var sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];
  857.         var i = Math.floor(Math.log(bytes) / Math.log(k));
  858.         return parseFloat((bytes / Math.pow(k, i)).toFixed(decimals)) + ' ' + sizes[i];
  859.     },
  860.    
  861.     /**
  862.      * 将毫秒转换为可读时间
  863.      * @param {number} ms - 毫秒数
  864.      * @returns {string} 可读时间字符串
  865.      */
  866.     formatDuration: function(ms) {
  867.         if (ms < 1000) return ms + 'ms';
  868.         var seconds = Math.floor(ms / 1000);
  869.         if (seconds < 60) return seconds + 's';
  870.         var minutes = Math.floor(seconds / 60);
  871.         if (minutes < 60) return minutes + 'm ' + (seconds % 60) + 's';
  872.         var hours = Math.floor(minutes / 60);
  873.         return hours + 'h ' + (minutes % 60) + 'm';
  874.     },
  875.    
  876.     /**
  877.      * 检查是否为整数
  878.      * @param {*} value - 要检查的值
  879.      * @returns {boolean} 是否为整数
  880.      */
  881.     isInteger: function(value) {
  882.         return typeof value === 'number' && isFinite(value) && Math.floor(value) === value;
  883.     },
  884.    
  885.     /**
  886.      * 检查是否为数字
  887.      * @param {*} value - 要检查的值
  888.      * @returns {boolean} 是否为数字
  889.      */
  890.     isNumber: function(value) {
  891.         return typeof value === 'number' && isFinite(value);
  892.     },
  893.    
  894.     /**
  895.      * 将字符串转换为数字
  896.      * @param {string} str - 要转换的字符串
  897.      * @param {*} defaultValue - 转换失败时的默认值
  898.      * @returns {number} 转换后的数字
  899.      */
  900.     toNumber: function(str, defaultValue) {
  901.         var num = parseFloat(str);
  902.         return isNaN(num) ? defaultValue : num;
  903.     },
  904.    
  905.     /**
  906.      * 将数字转换为中文大写金额
  907.      * @param {number} num - 要转换的数字
  908.      * @returns {string} 中文大写金额
  909.      */
  910.     toChineseMoney: function(num) {
  911.         var units = ['', '十', '百', '千'];
  912.         var bigUnits = ['', '万', '亿'];
  913.         var digits = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九'];
  914.         
  915.         if (num === 0) return '零';
  916.         if (num < 0) return '负' + this.toChineseMoney(-num);
  917.         
  918.         var strNum = Math.floor(num).toString();
  919.         var result = '';
  920.         var zeroCount = 0;
  921.         var bigUnitIndex = 0;
  922.         
  923.         for (var i = strNum.length - 1; i >= 0; i -= 4) {
  924.             var part = '';
  925.             var partZero = true;
  926.             for (var j = 0; j < 4 && i - j >= 0; j++) {
  927.                 var digit = parseInt(strNum[i - j]);
  928.                 if (digit === 0) {
  929.                     zeroCount++;
  930.                 } else {
  931.                     if (zeroCount > 0) {
  932.                         part = digits[0] + part;
  933.                         zeroCount = 0;
  934.                     }
  935.                     part = digits[digit] + units[j] + part;
  936.                     partZero = false;
  937.                 }
  938.             }
  939.             if (!partZero) {
  940.                 result = part + bigUnits[bigUnitIndex] + result;
  941.             }
  942.             bigUnitIndex++;
  943.         }
  944.         
  945.         return result.replace(/零+/g, '零').replace(/零$/, '');
  946.     },
  947.    
  948.     /**
  949.      * 将数字转换为罗马数字
  950.      * @param {number} num - 要转换的数字 (1-3999)
  951.      * @returns {string} 罗马数字
  952.      */
  953.     toRoman: function(num) {
  954.         if (num < 1 || num > 3999) return '';
  955.         var values = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1];
  956.         var symbols = ['M', 'CM', 'D', 'CD', 'C', 'XC', 'L', 'XL', 'X', 'IX', 'V', 'IV', 'I'];
  957.         var result = '';
  958.         for (var i = 0; i < values.length; i++) {
  959.             while (num >= values[i]) {
  960.                 result += symbols[i];
  961.                 num -= values[i];
  962.             }
  963.         }
  964.         return result;
  965.     },
  966.    
  967.     /**
  968.      * 将罗马数字转换为数字
  969.      * @param {string} roman - 罗马数字
  970.      * @returns {number} 转换后的数字
  971.      */
  972.     fromRoman: function(roman) {
  973.         var values = {I: 1, V: 5, X: 10, L: 50, C: 100, D: 500, M: 1000};
  974.         var result = 0;
  975.         for (var i = 0; i < roman.length; i++) {
  976.             var current = values[roman[i]];
  977.             var next = values[roman[i + 1]];
  978.             if (next && current < next) {
  979.                 result -= current;
  980.             } else {
  981.                 result += current;
  982.             }
  983.         }
  984.         return result;
  985.     },
  986.    
  987.     /**
  988.      * 生成指定范围内的随机数数组
  989.      * @param {number} count - 数组长度
  990.      * @param {number} min - 最小值
  991.      * @param {number} max - 最大值
  992.      * @returns {Array} 随机数数组
  993.      */
  994.     randomArray: function(count, min, max) {
  995.         var result = [];
  996.         for (var i = 0; i < count; i++) {
  997.             result.push(MathUtils.randomInt(min, max));
  998.         }
  999.         return result;
  1000.     }
  1001. };

  1002. // =============================================================================
  1003. // 第六部分:时间管理工具类 (TimeUtils)
  1004. // =============================================================================

  1005. /**
  1006. * 时间管理工具类
  1007. * 提供日期时间格式化、计算、转换等高级功能
  1008. */
  1009. var TimeUtils = {
  1010.    
  1011.     /**
  1012.      * 格式化日期时间
  1013.      * @param {Date} date - 日期对象
  1014.      * @param {string} format - 格式字符串 (yyyy-MM-dd HH:mm:ss)
  1015.      * @returns {string} 格式化后的字符串
  1016.      */
  1017.     format: function(date, format) {
  1018.         format = format || 'yyyy-MM-dd HH:mm:ss';
  1019.         var year = date.getFullYear();
  1020.         var month = date.getMonth() + 1;
  1021.         var day = date.getDate();
  1022.         var hours = date.getHours();
  1023.         var minutes = date.getMinutes();
  1024.         var seconds = date.getSeconds();
  1025.         var milliseconds = date.getMilliseconds();
  1026.         
  1027.         return format
  1028.             .replace(/yyyy/g, year)
  1029.             .replace(/MM/g, StringUtils.padStart(month.toString(), 2, '0'))
  1030.             .replace(/dd/g, StringUtils.padStart(day.toString(), 2, '0'))
  1031.             .replace(/HH/g, StringUtils.padStart(hours.toString(), 2, '0'))
  1032.             .replace(/mm/g, StringUtils.padStart(minutes.toString(), 2, '0'))
  1033.             .replace(/ss/g, StringUtils.padStart(seconds.toString(), 2, '0'))
  1034.             .replace(/SSS/g, StringUtils.padStart(milliseconds.toString(), 3, '0'));
  1035.     },
  1036.    
  1037.     /**
  1038.      * 获取当前时间字符串
  1039.      * @param {string} format - 格式字符串
  1040.      * @returns {string} 当前时间字符串
  1041.      */
  1042.     now: function(format) {
  1043.         return this.format(new Date(), format);
  1044.     },
  1045.    
  1046.     /**
  1047.      * 获取今天的开始时间
  1048.      * @returns {Date} 今天的开始时间
  1049.      */
  1050.     startOfDay: function() {
  1051.         var date = new Date();
  1052.         date.setHours(0, 0, 0, 0);
  1053.         return date;
  1054.     },
  1055.    
  1056.     /**
  1057.      * 获取今天的结束时间
  1058.      * @returns {Date} 今天的结束时间
  1059.      */
  1060.     endOfDay: function() {
  1061.         var date = new Date();
  1062.         date.setHours(23, 59, 59, 999);
  1063.         return date;
  1064.     },
  1065.    
  1066.     /**
  1067.      * 添加时间
  1068.      * @param {Date} date - 原日期
  1069.      * @param {number} amount - 数量
  1070.      * @param {string} unit - 单位 (year, month, day, hour, minute, second)
  1071.      * @returns {Date} 新的日期
  1072.      */
  1073.     add: function(date, amount, unit) {
  1074.         var result = new Date(date);
  1075.         switch (unit) {
  1076.             case 'year':
  1077.                 result.setFullYear(result.getFullYear() + amount);
  1078.                 break;
  1079.             case 'month':
  1080.                 result.setMonth(result.getMonth() + amount);
  1081.                 break;
  1082.             case 'day':
  1083.                 result.setDate(result.getDate() + amount);
  1084.                 break;
  1085.             case 'hour':
  1086.                 result.setHours(result.getHours() + amount);
  1087.                 break;
  1088.             case 'minute':
  1089.                 result.setMinutes(result.getMinutes() + amount);
  1090.                 break;
  1091.             case 'second':
  1092.                 result.setSeconds(result.getSeconds() + amount);
  1093.                 break;
  1094.         }
  1095.         return result;
  1096.     },
  1097.    
  1098.     /**
  1099.      * 计算两个日期之间的差值
  1100.      * @param {Date} date1 - 第一个日期
  1101.      * @param {Date} date2 - 第二个日期
  1102.      * @param {string} unit - 返回单位 (ms, s, m, h, d)
  1103.      * @returns {number} 差值
  1104.      */
  1105.     diff: function(date1, date2, unit) {
  1106.         var diffMs = date2 - date1;
  1107.         switch (unit) {
  1108.             case 'ms': return diffMs;
  1109.             case 's': return Math.floor(diffMs / 1000);
  1110.             case 'm': return Math.floor(diffMs / (1000 * 60));
  1111.             case 'h': return Math.floor(diffMs / (1000 * 60 * 60));
  1112.             case 'd': return Math.floor(diffMs / (1000 * 60 * 60 * 24));
  1113.             default: return diffMs;
  1114.         }
  1115.     },
  1116.    
  1117.     /**
  1118.      * 判断是否为闰年
  1119.      * @param {number} year - 年份
  1120.      * @returns {boolean} 是否为闰年
  1121.      */
  1122.     isLeapYear: function(year) {
  1123.         return (year % 4 === 0 && year % 100 !== 0) || (year % 400 === 0);
  1124.     },
  1125.    
  1126.     /**
  1127.      * 获取月份天数
  1128.      * @param {number} year - 年份
  1129.      * @param {number} month - 月份 (1-12)
  1130.      * @returns {number} 天数
  1131.      */
  1132.     daysInMonth: function(year, month) {
  1133.         var days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
  1134.         if (month === 2 && this.isLeapYear(year)) {
  1135.             return 29;
  1136.         }
  1137.         return days[month - 1];
  1138.     },
  1139.    
  1140.     /**
  1141.      * 获取日期是星期几
  1142.      * @param {Date} date - 日期
  1143.      * @returns {string} 星期几
  1144.      */
  1145.     dayOfWeek: function(date) {
  1146.         var days = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];
  1147.         return days[date.getDay()];
  1148.     },
  1149.    
  1150.     /**
  1151.      * 获取日期是一年中的第几天
  1152.      * @param {Date} date - 日期
  1153.      * @returns {number} 第几天
  1154.      */
  1155.     dayOfYear: function(date) {
  1156.         var start = new Date(date.getFullYear(), 0, 0);
  1157.         var diff = date - start;
  1158.         return Math.floor(diff / (1000 * 60 * 60 * 24));
  1159.     },
  1160.    
  1161.     /**
  1162.      * 获取日期所在周的起始日期
  1163.      * @param {Date} date - 日期
  1164.      * @returns {Date} 周起始日期(周一)
  1165.      */
  1166.     startOfWeek: function(date) {
  1167.         var result = new Date(date);
  1168.         var day = result.getDay();
  1169.         var diff = result.getDate() - day + (day === 0 ? -6 : 1);
  1170.         result.setDate(diff);
  1171.         result.setHours(0, 0, 0, 0);
  1172.         return result;
  1173.     },
  1174.    
  1175.     /**
  1176.      * 倒计时格式化
  1177.      * @param {number} seconds - 剩余秒数
  1178.      * @returns {string} 格式化后的倒计时
  1179.      */
  1180.     countdown: function(seconds) {
  1181.         var hours = Math.floor(seconds / 3600);
  1182.         var minutes = Math.floor((seconds % 3600) / 60);
  1183.         var secs = seconds % 60;
  1184.         return StringUtils.padStart(hours.toString(), 2, '0') + ':' +
  1185.                StringUtils.padStart(minutes.toString(), 2, '0') + ':' +
  1186.                StringUtils.padStart(secs.toString(), 2, '0');
  1187.     },
  1188.    
  1189.     /**
  1190.      * 获取相对时间描述
  1191.      * @param {Date} date - 日期
  1192.      * @returns {string} 相对时间描述
  1193.      */
  1194.     fromNow: function(date) {
  1195.         var now = new Date();
  1196.         var diff = Math.floor((now - date) / 1000);
  1197.         
  1198.         if (diff < 60) return '刚刚';
  1199.         if (diff < 3600) return Math.floor(diff / 60) + '分钟前';
  1200.         if (diff < 86400) return Math.floor(diff / 3600) + '小时前';
  1201.         if (diff < 604800) return Math.floor(diff / 86400) + '天前';
  1202.         return this.format(date, 'yyyy-MM-dd');
  1203.     },
  1204.    
  1205.     /**
  1206.      * 解析日期字符串
  1207.      * @param {string} str - 日期字符串
  1208.      * @returns {Date} 日期对象
  1209.      */
  1210.     parse: function(str) {
  1211.         return new Date(str);
  1212.     },
  1213.    
  1214.     /**
  1215.      * 获取时间戳
  1216.      * @param {Date} date - 日期对象,默认为当前时间
  1217.      * @returns {number} 时间戳
  1218.      */
  1219.     timestamp: function(date) {
  1220.         return (date || new Date()).getTime();
  1221.     },
  1222.    
  1223.     /**
  1224.      * 休眠指定毫秒数(阻塞式)
  1225.      * @param {number} ms - 毫秒数
  1226.      */
  1227.     sleep: function(ms) {
  1228.         var start = new Date().getTime();
  1229.         while (new Date().getTime() - start < ms) {
  1230.             // 阻塞等待
  1231.         }
  1232.     },
  1233.    
  1234.     /**
  1235.      * 生成时间范围数组
  1236.      * @param {Date} start - 开始日期
  1237.      * @param {Date} end - 结束日期
  1238.      * @param {string} unit - 步进单位 (day, week, month)
  1239.      * @returns {Array} 日期数组
  1240.      */
  1241.     range: function(start, end, unit) {
  1242.         var result = [];
  1243.         var current = new Date(start);
  1244.         var endDate = new Date(end);
  1245.         
  1246.         while (current <= endDate) {
  1247.             result.push(new Date(current));
  1248.             switch (unit) {
  1249.                 case 'day':
  1250.                     current.setDate(current.getDate() + 1);
  1251.                     break;
  1252.                 case 'week':
  1253.                     current.setDate(current.getDate() + 7);
  1254.                     break;
  1255.                 case 'month':
  1256.                     current.setMonth(current.getMonth() + 1);
  1257.                     break;
  1258.             }
  1259.         }
  1260.         return result;
  1261.     }
  1262. };

  1263. // =============================================================================
  1264. // 第七部分:综合演示函数
  1265. // =============================================================================

  1266. /**
  1267. * 延迟函数 - 毫秒
  1268. */
  1269. function delay(ms) {
  1270.     var start = new Date().getTime();
  1271.     while (new Date().getTime() - start < ms) {}
  1272. }

  1273. /**
  1274. * 运行所有工具类的演示
  1275. */
  1276. function runAllDemos() {
  1277.     printl('');
  1278.     printl('╔══════════════════════════════════════════════════════════════════╗');
  1279.     printl('║           AIWROK 核心工具库完整示例 v2.0                      ║');
  1280.     printl('╚══════════════════════════════════════════════════════════════════╝');
  1281.     printl('');
  1282.     delay(800);
  1283.    
  1284.     demoObjectUtils();
  1285.     delay(500);
  1286.     demoArrayUtils();
  1287.     delay(500);
  1288.     demoStringUtils();
  1289.     delay(500);
  1290.     demoMathUtils();
  1291.     delay(500);
  1292.     demoNumberUtils();
  1293.     delay(500);
  1294.     demoTimeUtils();
  1295.    
  1296.     printl('');
  1297.     printl('╔══════════════════════════════════════════════════════════════════╗');
  1298.     printl('║                   ✓ 所有演示已完成!                          ║');
  1299.     printl('╚══════════════════════════════════════════════════════════════════╝');
  1300.     printl('');
  1301. }

  1302. /**
  1303. * 对象操作工具类演示
  1304. */
  1305. function demoObjectUtils() {
  1306.     printl('┌──────────────────────────────────────────────────────────────────┐');
  1307.     printl('│  ObjectUtils - 对象操作工具类                                  │');
  1308.     printl('└──────────────────────────────────────────────────────────────────┘');
  1309.     printl('');
  1310.     delay(400);
  1311.    
  1312.     printl('▶ 1. 深度合并 - 合并多个对象(包含嵌套对象)');
  1313.     delay(300);
  1314.     var obj1 = { a: 1, b: { c: 2 } };
  1315.     var obj2 = { b: { d: 3 }, e: 4 };
  1316.     var merged = ObjectUtils.deepMerge({}, obj1, obj2);
  1317.     printl('   源对象1: ' + JSON.stringify(obj1));
  1318.     delay(200);
  1319.     printl('   源对象2: ' + JSON.stringify(obj2));
  1320.     delay(200);
  1321.     printl('   合并结果: ' + JSON.stringify(merged));
  1322.     delay(500);
  1323.    
  1324.     printl('▶ 2. 深度克隆 - 完整复制对象(包含嵌套对象)');
  1325.     delay(300);
  1326.     var original = { x: 1, y: { z: 2 } };
  1327.     var cloned = ObjectUtils.deepClone(original);
  1328.     printl('   原对象: ' + JSON.stringify(original));
  1329.     delay(200);
  1330.     printl('   克隆: ' + JSON.stringify(cloned));
  1331.     delay(500);
  1332.    
  1333.     printl('▶ 3. 安全获取 - 获取嵌套属性,避免报错');
  1334.     delay(300);
  1335.     var data = { user: { profile: { name: '张三' } } };
  1336.     var name = ObjectUtils.getSafe(data, 'user.profile.name', '未知');
  1337.     printl('   数据: { user: { profile: { name: "张三" } } }');
  1338.     delay(200);
  1339.     printl('   读取 user.profile.name: ' + name);
  1340.     delay(200);
  1341.     var noExist = ObjectUtils.getSafe(data, 'user.profile.age', '默认值');
  1342.     printl('   读取 user.profile.age(不存在): ' + noExist);
  1343.     delay(500);
  1344.    
  1345.     printl('▶ 4. 对象转查询字符串');
  1346.     delay(300);
  1347.     var params = { name: '张三', age: 25 };
  1348.     var query = ObjectUtils.toQueryString(params);
  1349.     printl('   对象: ' + JSON.stringify(params));
  1350.     delay(200);
  1351.     printl('   查询字符串: ' + query);
  1352.     delay(500);
  1353.    
  1354.     printl('▶ 5. 查询字符串转对象');
  1355.     delay(300);
  1356.     var parsed = ObjectUtils.fromQueryString(query);
  1357.     printl('   解析结果: ' + JSON.stringify(parsed));
  1358.     delay(500);
  1359.    
  1360.     printl('');
  1361. }

  1362. /**
  1363. * 数组操作工具类演示
  1364. */
  1365. function demoArrayUtils() {
  1366.     printl('┌──────────────────────────────────────────────────────────────────┐');
  1367.     printl('│  ArrayUtils - 数组操作工具类                                  │');
  1368.     printl('└──────────────────────────────────────────────────────────────────┘');
  1369.     printl('');
  1370.     delay(400);
  1371.    
  1372.     printl('▶ 1. 数组去重 - 移除重复元素');
  1373.     delay(300);
  1374.     var arr1 = [1, 2, 2, 3, 3, 3, 4, 4, 5];
  1375.     printl('   原始数组: ' + JSON.stringify(arr1));
  1376.     delay(200);
  1377.     var unique = ArrayUtils.unique(arr1);
  1378.     printl('   去重结果: ' + JSON.stringify(unique));
  1379.     delay(500);
  1380.    
  1381.     printl('▶ 2. 数组过滤 - 按条件筛选');
  1382.     delay(300);
  1383.     var arr2 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
  1384.     printl('   原始数组: ' + JSON.stringify(arr2));
  1385.     delay(200);
  1386.     var filtered = ArrayUtils.filter(arr2, function(x) { return x > 5; });
  1387.     printl('   过滤条件: x > 5');
  1388.     printl('   过滤结果: ' + JSON.stringify(filtered));
  1389.     delay(500);
  1390.    
  1391.     printl('▶ 3. 数组映射 - 转换每个元素');
  1392.     delay(300);
  1393.     printl('   原始数组: ' + JSON.stringify(arr2));
  1394.     delay(200);
  1395.     var mapped = ArrayUtils.map(arr2, function(x) { return x * 2; });
  1396.     printl('   映射规则: x * 2');
  1397.     printl('   映射结果: ' + JSON.stringify(mapped));
  1398.     delay(500);
  1399.    
  1400.     printl('▶ 4. 数组分块 - 将数组分成多个小块');
  1401.     delay(300);
  1402.     var arr3 = [1, 2, 3, 4, 5, 6];
  1403.     printl('   原始数组: ' + JSON.stringify(arr3));
  1404.     delay(200);
  1405.     var chunked = ArrayUtils.chunk(arr3, 2);
  1406.     printl('   分块大小: 2');
  1407.     printl('   分块结果: ' + JSON.stringify(chunked));
  1408.     delay(500);
  1409.    
  1410.     printl('▶ 5. 数组随机取样 - 随机抽取元素');
  1411.     delay(300);
  1412.     var arr4 = ['苹果', '香蕉', '橙子', '葡萄', '西瓜'];
  1413.     printl('   水果列表: ' + JSON.stringify(arr4));
  1414.     delay(200);
  1415.     var sample = ArrayUtils.sample(arr4);
  1416.     printl('   随机抽取: ' + sample + ' &#127881;');
  1417.     delay(500);
  1418.    
  1419.     printl('');
  1420. }

  1421. /**
  1422. * 字符串操作工具类演示
  1423. */
  1424. function demoStringUtils() {
  1425.     printl('┌──────────────────────────────────────────────────────────────────┐');
  1426.     printl('│  StringUtils - 字符串操作工具类                                │');
  1427.     printl('└──────────────────────────────────────────────────────────────────┘');
  1428.     printl('');
  1429.     delay(400);
  1430.    
  1431.     printl('▶ 1. 字符串填充 - 补齐位数');
  1432.     delay(300);
  1433.     var padded = StringUtils.padStart('42', 5, '0');
  1434.     printl('   原字符串: "42"');
  1435.     printl('   目标长度: 5, 填充字符: "0"');
  1436.     printl('   填充结果: "' + padded + '"');
  1437.     delay(500);
  1438.    
  1439.     printl('▶ 2. 字符串截断 - 限制长度');
  1440.     delay(300);
  1441.     var longText = '这是一段非常长的字符串,需要截断显示';
  1442.     printl('   原文: ' + longText);
  1443.     delay(200);
  1444.     var truncated = StringUtils.truncate(longText, 15);
  1445.     printl('   截断长度: 15');
  1446.     printl('   截断结果: ' + truncated);
  1447.     delay(500);
  1448.    
  1449.     printl('▶ 3. 驼峰转下划线 - 命名风格转换');
  1450.     delay(300);
  1451.     var camel = 'userNameAndPassword';
  1452.     printl('   驼峰命名: ' + camel);
  1453.     delay(200);
  1454.     var snake = StringUtils.camelToSnake(camel);
  1455.     printl('   下划线: ' + snake);
  1456.     delay(500);
  1457.    
  1458.     printl('▶ 4. 首字母大写');
  1459.     delay(300);
  1460.     var text = 'hello world';
  1461.     printl('   原文: ' + text);
  1462.     delay(200);
  1463.     var capitalized = StringUtils.capitalize(text);
  1464.     printl('   首字母大写: ' + capitalized);
  1465.     delay(500);
  1466.    
  1467.     printl('▶ 5. 生成随机字符串');
  1468.     delay(300);
  1469.     var random = StringUtils.random(12);
  1470.     printl('   随机字符串(12位): ' + random);
  1471.     delay(500);
  1472.    
  1473.     printl('');
  1474. }

  1475. /**
  1476. * 数学计算工具类演示
  1477. */
  1478. function demoMathUtils() {
  1479.     printl('┌──────────────────────────────────────────────────────────────────┐');
  1480.     printl('│  MathUtils - 数学计算工具类                                   │');
  1481.     printl('└──────────────────────────────────────────────────────────────────┘');
  1482.     printl('');
  1483.     delay(400);
  1484.    
  1485.     printl('▶ 1. 角度与弧度转换');
  1486.     delay(300);
  1487.     var degrees = 180;
  1488.     printl('   角度: ' + degrees + '°');
  1489.     delay(200);
  1490.     var radians = MathUtils.toRadians(degrees);
  1491.     printl('   弧度: ' + radians.toFixed(4));
  1492.     delay(500);
  1493.    
  1494.     printl('▶ 2. 数值范围限制');
  1495.     delay(300);
  1496.     var testValue = 150;
  1497.     printl('   测试值: ' + testValue);
  1498.     delay(200);
  1499.     var clamped = MathUtils.clamp(testValue, 0, 100);
  1500.     printl('   限制范围: 0-100');
  1501.     printl('   限制结果: ' + clamped);
  1502.     delay(500);
  1503.    
  1504.     printl('▶ 3. 两点距离计算');
  1505.     delay(300);
  1506.     var x1 = 0, y1 = 0, x2 = 3, y2 = 4;
  1507.     printl('   点A: (' + x1 + ', ' + y1 + ')');
  1508.     printl('   点B: (' + x2 + ', ' + y2 + ')');
  1509.     delay(200);
  1510.     var distance = MathUtils.distance(x1, y1, x2, y2);
  1511.     printl('   距离: ' + distance);
  1512.     delay(500);
  1513.    
  1514.     printl('▶ 4. 随机整数生成');
  1515.     delay(300);
  1516.     var min = 1, max = 100;
  1517.     printl('   范围: ' + min + ' - ' + max);
  1518.     delay(200);
  1519.     var randomInt = MathUtils.randomInt(min, max);
  1520.     printl('   随机整数: ' + randomInt);
  1521.     delay(500);
  1522.    
  1523.     printl('▶ 5. 计算平均值');
  1524.     delay(300);
  1525.     var nums = [10, 20, 30, 40, 50];
  1526.     printl('   数字列表: ' + JSON.stringify(nums));
  1527.     delay(200);
  1528.     var avg = MathUtils.average.apply(null, nums);
  1529.     printl('   平均值: ' + avg);
  1530.     delay(500);
  1531.    
  1532.     printl('');
  1533. }

  1534. /**
  1535. * 数字处理工具类演示
  1536. */
  1537. function demoNumberUtils() {
  1538.     printl('┌──────────────────────────────────────────────────────────────────┐');
  1539.     printl('│  NumberUtils - 数字处理工具类                                 │');
  1540.     printl('└──────────────────────────────────────────────────────────────────┘');
  1541.     printl('');
  1542.     delay(400);
  1543.    
  1544.     printl('▶ 1. 千分位格式化 - 金额显示');
  1545.     delay(300);
  1546.     var amount = 1234567.89;
  1547.     printl('   原始金额: ' + amount);
  1548.     delay(200);
  1549.     var formatted = NumberUtils.formatThousands(amount);
  1550.     printl('   格式化后: ¥' + formatted);
  1551.     delay(500);
  1552.    
  1553.     printl('▶ 2. 字节大小格式化 - 文件大小');
  1554.     delay(300);
  1555.     var fileSize = 1536000;
  1556.     printl('   原始字节: ' + fileSize + ' bytes');
  1557.     delay(200);
  1558.     var bytes = NumberUtils.formatBytes(fileSize);
  1559.     printl('   格式化后: ' + bytes);
  1560.     delay(500);
  1561.    
  1562.     printl('▶ 3. 时长格式化 - 显示友好的时间');
  1563.     delay(300);
  1564.     var ms = 3661000;
  1565.     printl('   原始毫秒: ' + ms);
  1566.     delay(200);
  1567.     var duration = NumberUtils.formatDuration(ms);
  1568.     printl('   格式化后: ' + duration);
  1569.     delay(500);
  1570.    
  1571.     printl('▶ 4. 数字转中文大写 - 金额显示');
  1572.     delay(300);
  1573.     var money = 12345;
  1574.     printl('   原始数字: ' + money);
  1575.     delay(200);
  1576.     var chinese = NumberUtils.toChineseMoney(money);
  1577.     printl('   中文大写: ' + chinese);
  1578.     delay(500);
  1579.    
  1580.     printl('▶ 5. 数字转罗马数字');
  1581.     delay(300);
  1582.     var year = 2024;
  1583.     printl('   原始数字: ' + year);
  1584.     delay(200);
  1585.     var roman = NumberUtils.toRoman(year);
  1586.     printl('   罗马数字: ' + roman);
  1587.     delay(500);
  1588.    
  1589.     printl('');
  1590. }

  1591. /**
  1592. * 时间管理工具类演示
  1593. */
  1594. function demoTimeUtils() {
  1595.     printl('┌──────────────────────────────────────────────────────────────────┐');
  1596.     printl('│  TimeUtils - 时间管理工具类                                    │');
  1597.     printl('└──────────────────────────────────────────────────────────────────┘');
  1598.     printl('');
  1599.     delay(400);
  1600.    
  1601.     printl('▶ 1. 时间格式化 - 自定义格式显示');
  1602.     delay(300);
  1603.     var now = new Date();
  1604.     printl('   当前时间: ' + TimeUtils.format(now, 'yyyy-MM-dd HH:mm:ss'));
  1605.     delay(200);
  1606.     printl('   简洁格式: ' + TimeUtils.format(now, 'MM/dd HH:mm'));
  1607.     delay(500);
  1608.    
  1609.     printl('▶ 2. 获取星期几');
  1610.     delay(300);
  1611.     printl('   今天: ' + TimeUtils.dayOfWeek(now));
  1612.     delay(500);
  1613.    
  1614.     printl('▶ 3. 今年第几天');
  1615.     delay(300);
  1616.     printl('   今天是今年第 ' + TimeUtils.dayOfYear(now) + ' 天');
  1617.     delay(500);
  1618.    
  1619.     printl('▶ 4. 倒计时显示');
  1620.     delay(300);
  1621.     var countdownSeconds = 3665;
  1622.     printl('   原始秒数: ' + countdownSeconds);
  1623.     delay(200);
  1624.     var countdown = TimeUtils.countdown(countdownSeconds);
  1625.     printl('   倒计时: ' + countdown);
  1626.     delay(500);
  1627.    
  1628.     printl('▶ 5. 日期加减计算');
  1629.     delay(300);
  1630.     printl('   今天是: ' + TimeUtils.format(now, 'yyyy-MM-dd'));
  1631.     delay(200);
  1632.     var future = TimeUtils.add(now, 7, 'day');
  1633.     printl('   7天后: ' + TimeUtils.format(future, 'yyyy-MM-dd'));
  1634.     delay(200);
  1635.     var past = TimeUtils.add(now, -3, 'day');
  1636.     printl('   3天前: ' + TimeUtils.format(past, 'yyyy-MM-dd'));
  1637.     delay(500);
  1638.    
  1639.     printl('');
  1640. }

  1641. // 主函数入口(由 start.js 调用)
  1642. function runMainDemo() {
  1643.     runAllDemos();
  1644. }

  1645. // 注意:不在此处自动运行,由 start.js 控制调用时机
  1646. // 如需直接运行此脚本,取消下面一行的注释
  1647. runMainDemo();
复制代码







欢迎光临 B2B网络软件 (http://bbs.niubt.cn/) Powered by Discuz! X3.2