信息发布软件,b2b软件,广告发布软件

 找回密码
 立即注册
搜索
查看: 3|回复: 0
打印 上一主题 下一主题

[宣传软件网站动态] AIWROK安卓苹果平台设计的实用工具库

[复制链接]

1884

主题

1894

帖子

1万

积分

积分
11024

资讯缩略图:

资讯发布日期:2026-03-17

资讯发布简介:AIWROK安卓苹果平台设计的实用工具库

资讯关键词:AIWROK安卓苹果平台设计的实用工具库

资讯所属分类:IT资讯 

联系:

① 本信息收集于网络,如有不对的地方欢迎联系我纠正!
② 本信息免费收录,不存在价格的问题!
③ 如果您的网站也想这样出现在这里,请您加好友情链接,我当天会审核通过!

④友情链接关键字:软件网站分类目录 网址:http://www.postbbs.com/

资讯详细描述
AIWROK安卓苹果平台设计的实用工具库
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();
复制代码



untoAIWROK软件Function导入方法实例演示nextnocontent
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

相关导读
群发软件AIWROK安卓苹果平台设计的实用工具库
AIWROK安卓苹果平台设计的实用工具库
群发软件AIWROK软件Function导入方法实例演示
AIWROK软件Function导入方法实例演示
群发软件苹果脚本实例1项目project应用示例
苹果脚本实例1项目project应用示例
群发软件苹果脚本实例1剪贴板功能集成
苹果脚本实例1剪贴板功能集成
群发软件苹果iOS脚本Detect类系统性使用示例
苹果iOS脚本Detect类系统性使用示例
群发软件AIWROK苹果系统打印H5界面日志输出
AIWROK苹果系统打印H5界面日志输出
群发软件H5案例自动化看广告撸金币系统
H5案例自动化看广告撸金币系统
群发软件AIWROK苹果脚本H5任务执行小例子
AIWROK苹果脚本H5任务执行小例子
群发软件AIWROK软件苹果水平容器[Horizontal]小实例
AIWROK软件苹果水平容器[Horizontal]小实例
群发软件AIWROK苹果脚本实例1界面UI输入框类[Input]
AIWROK苹果脚本实例1界面UI输入框类
群发软件AIWROK软件苹果脚本案例1空白站位[Space]方法
AIWROK软件苹果脚本案例1空白站位[Space]方法
群发软件AIWROK软件苹查系统复选框用法
AIWROK软件苹查系统复选框用法
群发软件苹果AIWROK实例单选按钮组类[RadioButtonGroup]完整综合示例
苹果AIWROK实例单选按钮组类[RadioButtonGroup]完整综合示例
群发软件AIWROK软件苹果实例UI-垂直容器[Vertical]高级综合示例
AIWROK软件苹果实例UI-垂直容器[Vertical]高级综合示例
群发软件IOS苹果脚本View的完整功能实例
IOS苹果脚本View的完整功能实例
群发软件AIWROK苹果系统实例演示1标签类[Label]方法
AIWROK苹果系统实例演示1标签类[Label]方法
信息发布软件AIWROK软件苹果UI按钮Button方法示例
AIWROK软件苹果UI按钮Button方法示例
信息发布软件AIWROK软件苹果TAB界面视图示例
AIWROK软件苹果TAB界面视图示例
信息发布软件AIWROK苹果系统自带view视图简洁UI界面示例
AIWROK苹果系统自带view视图简洁UI界面示例
信息发布软件汇集HID安卓输入文字的方法和复制粘贴示例
汇集HID安卓输入文字的方法和复制粘贴示例
信息发布软件AIWROK软件找字与OCR方法汇总示例
AIWROK软件找字与OCR方法汇总示例
信息发布软件AIWROK软件找图方法汇总示例
AIWROK软件找图方法汇总示例
信息发布软件AIWROK软件滑动方法集合示例
AIWROK软件滑动方法集合示例
信息发布软件AIWROK软件安卓AIWROK汇集软件点击
AIWROK软件安卓AIWROK汇集软件点击
信息发布软件苹果系统点击方法综合示例
苹果系统点击方法综合示例
信息发布软件AIWROK苹果系统找图方法完整示例集合
AIWROK苹果系统找图方法完整示例集合
信息发布软件苹果系统找图方法完整示例集合
苹果系统找图方法完整示例集合
信息发布软件苹果IOS系统找字OCR方法例子
苹果IOS系统找字OCR方法例子
信息发布软件AIWORK软件数组高级示例
AIWORK软件数组高级示例
信息发布软件AIWROK软件运算符封装库示例
AIWROK软件运算符封装库示例
信息发布软件AIWROK软件语法运行小示例
AIWROK软件语法运行小示例
信息发布软件AIWROK软件JS循环小示例
AIWROK软件JS循环小示例
信息发布软件AIWROK软件H5网页被主脚本获取值用法
AIWROK软件H5网页被主脚本获取值用法
信息发布软件AIWROK软件创建可暂停恢复的多线程任务
AIWROK软件创建可暂停恢复的多线程任务
信息发布软件AIWROK软件类型转换方法例子
AIWROK软件类型转换方法例子
信息发布软件AIWROK软件H5脚本执行与进度显示
AIWROK软件H5脚本执行与进度显示 .
信息发布软件AIWROK软件根据时间段执行异步任务支持多线程并行处理
AIWROK软件根据时间段执行异步任务支持多线程并行处理
信息发布软件H5自动开关执行脚本功能演示
H5自动开关执行脚本功能演示
信息发布软件AIWROK软件H5单选脚本运行示例
AIWROK软件H5单选脚本运行示例
信息发布软件H5任务脚本选择与执行中心
H5任务脚本选择与执行中心
信息发布软件H5里CheckBox控件演示
H5里CheckBox控件演示
信息发布软件AIWROK软件正则用法实际例子
AIWROK软件正则用法实际例子
信息发布软件AIWROK软件权限管理器实现
AIWROK软件权限管理器实现
信息发布软件AIWORK软件节点方法无碍示例子
AIWORK软件节点方法无碍示例子
信息发布软件JSON.stringify 和 JSON.parse 完整示例
JSON.stringify 和 JSON.parse 完整示例
信息发布软件AIWROK软件展示JavaScript各种语句标识符的用法
AIWROK软件展示JavaScript各种语句标识符的用法
信息发布软件JS巧妙地组合使用各种条件语句
JS巧妙地组合使用各种条件语句
信息发布软件AIWROK手机数据库MySQL数据库截图片批量上传操作脚本
AIWROK手机数据库MySQL数据库截图片批量上传操作脚本
信息发布软件HID中文输入智能打字功能
HID中文输入智能打字功能
信息发布软件AIWROK软件对象工具函数库例子
AIWROK软件对象工具函数库例子
信息发布软件AIWROK软件H5交互演示黄色主题
AIWROK软件H5交互演示黄色主题
信息发布软件H5单按钮执行脚本示例
H5单按钮执行脚本示例
信息发布软件苹果H5界面完整调用脚本示例
苹果H5界面完整调用脚本示例
信息发布软件AIWROK软件平台设备信息全面检测工具例子
AIWROK软件平台设备信息全面检测工具例子
信息发布软件AIWROK创建和放大日志窗口并展示动态内容
AIWROK创建和放大日志窗口并展示动态内容
信息发布软件AIWROK软件device相关方法获取设备信息例子
AIWROK软件device相关方法获取设备信息例子[/backcolor]
信息发布软件数据库MySQL实时内容随机调用
数据库MySQL实时内容随机调用
信息发布软件AIWROK软件分享一个特效苹果H5页面
AIWROK软件分享一个特效苹果H5页面
信息发布软件数据库MYQ业务流程心跳程序启动
数据库MYQ业务流程心跳程序启动
信息发布软件数据库MySQL功能支持创建表插入中文数据查询删除功能例子
数据库MySQL功能支持创建表插入中文数据查询删除功能例子
信息发布软件AIWROK软件Zip 高级操作复杂示例
AIWROK软件Zip 高级操作复杂示例
信息发布软件AIWROK软件txt_文件读写方法小结
AIWROK软件txt_文件读写方法小结
信息发布软件AIWROK软件file文件操作方法小结
AIWROK软件file文件操作方法小结
信息发布软件AIWORK软件配置读写H5演示配套脚本
AIWORK软件配置读写H5演示配套脚本
信息发布软件AIWROK配置读写功能演示示例
AIWROK配置读写功能演示示例

QQ|( 京ICP备09078825号 )

本网站信息发布软件,是可以发布论坛,发送信息到各大博客,各大b2b软件自动发布,好不夸张的说:只要手工能发在电脑打开IE能发的网站,用这个宣传软件就可以仿制动作,进行推送发到您想发送的B2B网站或是信息发布平台上,不管是后台,还是前台,都可以进行最方便的广告发布,这个广告发布软件,可以按月购买,还可以试用软件,对网站的验证码也可以完全自动对信息发布,让客户自动找上门,使企业轻松实现b2b发布,这个信息发布软件,均是本站原创正版开发,拥有正版的血统,想要新功能,欢迎提意见给我,一好的分类信息群发软件在手,舍我其谁。QQ896757558

GMT+8, 2026-3-17 13:37 , Processed in 0.370987 second(s), 51 queries .

宣传软件--信息发布软件--b2b软件广告发布软件

快速回复 返回顶部 返回列表