自动发帖软件
标题:
AIWROK软件示例数组方法实战应用
[打印本页]
作者:
发帖软件
时间:
3 小时前
标题:
AIWROK软件示例数组方法实战应用
AIWROK软件示例数组方法实战应用
3.png
(1.38 MB, 下载次数: 0)
3 小时前
上传
/**
* AIWROK数组方法实战应用示例
* 专为AIWROK安卓自动化环境设计的真实数组应用场景
*
* @功能特点
* - UI控件数组的查找、筛选和批量操作
* - 图像识别结果的数组处理和坐标计算
* - 设备信息数组的管理和查询
* - 任务队列数组的调度和执行
*
* @作者 AIWROK开发团队
* @版本 3.0 - 实战版
* @日期 2024
*/
//===========================================
// 基础兼容性设置
//===========================================
// AIWROK环境统一使用console.log输出日志
//===========================================
// 高级数组工具类 - 增强版
//===========================================
/**
* AdvancedArrayUtils - 高级数组操作工具类
* 提供链式调用、批量处理和性能优化功能
*/
function AdvancedArrayUtils() {
this.version = "2.0.0";
this.performanceMetrics = {
operations: 0,
startTime: 0,
endTime: 0,
memoryUsage: 0
};
}
/**
* 开始性能监控
*/
AdvancedArrayUtils.prototype.startPerformanceMonitoring = function() {
this.performanceMetrics.startTime = new Date().getTime();
this.performanceMetrics.operations = 0;
return this;
};
/**
* 结束性能监控并返回报告
*/
AdvancedArrayUtils.prototype.endPerformanceMonitoring = function() {
this.performanceMetrics.endTime = new Date().getTime();
var duration = this.performanceMetrics.endTime - this.performanceMetrics.startTime;
return {
duration: duration,
operations: this.performanceMetrics.operations,
opsPerSecond: Math.round(this.performanceMetrics.operations / (duration / 1000)),
memoryUsage: this.performanceMetrics.memoryUsage
};
};
/**
* 安全数组遍历 - 支持中断和异常处理
* @param {Array} array - 要遍历的数组
* @param {Function} callback - 回调函数,返回false可中断遍历
* @param {Object} context - 回调函数上下文
* @returns {AdvancedArrayUtils} 支持链式调用
*/
AdvancedArrayUtils.prototype.forEachSafe = function(array, callback, context) {
if (!Array.isArray(array)) throw new Error('参数必须是数组');
if (typeof callback !== 'function') throw new Error('回调函数必须是函数');
context = context || this;
try {
for (var i = 0; i < array.length; i++) {
this.performanceMetrics.operations++;
var result = callback.call(context, array[i], i, array);
if (result === false) break; // 支持主动中断
}
} catch (e) {
console.log("数组遍历错误 at index " + i + ": " + (e.message || e));
}
return this;
};
/**
* 智能数组过滤 - 支持多条件和复杂逻辑
* @param {Array} array - 源数组
* @param {Array} conditions - 过滤条件数组
* @returns {Array} 过滤后的数组
*
* @示例
* var result = advancedArrayUtils.smartFilter(data, [
* { field: 'age', operator: '>', value: 18 },
* { field: 'name', operator: 'contains', value: '张' },
* { field: 'score', operator: 'between', value: [60, 100] }
* ]);
*/
AdvancedArrayUtils.prototype.smartFilter = function(array, conditions) {
if (!Array.isArray(array)) throw new Error('第一个参数必须是数组');
if (!Array.isArray(conditions)) throw new Error('条件参数必须是数组');
var self = this;
return array.filter(function(item) {
self.performanceMetrics.operations++;
for (var i = 0; i < conditions.length; i++) {
var condition = conditions[i];
var fieldValue = self.getFieldValue(item, condition.field);
if (!self.evaluateCondition(fieldValue, condition.operator, condition.value)) {
return false;
}
}
return true;
});
};
/**
* 获取对象字段值 - 支持嵌套属性访问
*/
AdvancedArrayUtils.prototype.getFieldValue = function(obj, field) {
if (!obj || !field) return undefined;
var parts = field.split('.');
var result = obj;
for (var i = 0; i < parts.length; i++) {
if (result === null || result === undefined) return undefined;
result = result[parts[i]];
}
return result;
};
/**
* 评估条件 - 支持多种操作符
*/
AdvancedArrayUtils.prototype.evaluateCondition = function(fieldValue, operator, conditionValue) {
switch (operator) {
case '==': return fieldValue == conditionValue;
case '===': return fieldValue === conditionValue;
case '!=': return fieldValue != conditionValue;
case '!==': return fieldValue !== conditionValue;
case '>': return fieldValue > conditionValue;
case '>=': return fieldValue >= conditionValue;
case '<': return fieldValue < conditionValue;
case '<=': return fieldValue <= conditionValue;
case 'contains':
return String(fieldValue).indexOf(conditionValue) !== -1;
case 'startsWith':
return String(fieldValue).indexOf(conditionValue) === 0;
case 'endsWith':
var str = String(fieldValue);
return str.lastIndexOf(conditionValue) === str.length - conditionValue.length;
case 'between':
return fieldValue >= conditionValue[0] && fieldValue <= conditionValue[1];
case 'in':
return conditionValue.indexOf(fieldValue) !== -1;
case 'notIn':
return conditionValue.indexOf(fieldValue) === -1;
default:
return false;
}
};
/**
* 数组数据聚合 - 支持多种聚合函数
* @param {Array} array - 源数组
* @param {Object} config - 聚合配置
* @returns {Object} 聚合结果
*
* @示例
* var stats = advancedArrayUtils.aggregate(salesData, {
* groupBy: 'category',
* metrics: {
* totalSales: { field: 'amount', operation: 'sum' },
* avgPrice: { field: 'price', operation: 'avg' },
* count: { operation: 'count' }
* }
* });
*/
AdvancedArrayUtils.prototype.aggregate = function(array, config) {
if (!Array.isArray(array)) throw new Error('参数必须是数组');
var result = {};
var self = this;
// 分组处理
if (config.groupBy) {
var groups = {};
array.forEach(function(item) {
self.performanceMetrics.operations++;
var groupKey = self.getFieldValue(item, config.groupBy);
if (!groups[groupKey]) {
groups[groupKey] = [];
}
groups[groupKey].push(item);
});
// 对每个分组进行聚合
for (var groupKey in groups) {
if (groups.hasOwnProperty(groupKey)) {
result[groupKey] = self.calculateMetrics(groups[groupKey], config.metrics);
}
}
} else {
// 不分组,直接聚合
result = this.calculateMetrics(array, config.metrics);
}
return result;
};
/**
* 计算指标 - 支持多种聚合操作
*/
AdvancedArrayUtils.prototype.calculateMetrics = function(array, metrics) {
var result = {};
var self = this;
for (var metricName in metrics) {
if (metrics.hasOwnProperty(metricName)) {
var metric = metrics[metricName];
result[metricName] = self.calculateMetric(array, metric);
}
}
return result;
};
/**
* 计算单个指标
*/
AdvancedArrayUtils.prototype.calculateMetric = function(array, metric) {
var operation = metric.operation;
var field = metric.field;
switch (operation) {
case 'count':
return array.length;
case 'sum':
return array.reduce(function(sum, item) {
return sum + (field ? this.getFieldValue(item, field) : item);
}.bind(this), 0);
case 'avg':
var sum = array.reduce(function(sum, item) {
return sum + (field ? this.getFieldValue(item, field) : item);
}.bind(this), 0);
return array.length > 0 ? sum / array.length : 0;
case 'max':
return Math.max.apply(Math, array.map(function(item) {
return field ? this.getFieldValue(item, field) : item;
}.bind(this)));
case 'min':
return Math.min.apply(Math, array.map(function(item) {
return field ? this.getFieldValue(item, field) : item;
}.bind(this)));
default:
return 0;
}
};
/**
* 数组分页处理 - 支持大数据集的分页显示
* @param {Array} array - 源数组
* @param {number} pageSize - 每页大小
* @param {number} pageNumber - 页码(从1开始)
* @returns {Object} 分页结果
*/
AdvancedArrayUtils.prototype.paginate = function(array, pageSize, pageNumber) {
if (!Array.isArray(array)) throw new Error('参数必须是数组');
pageSize = Math.max(1, pageSize || 10);
pageNumber = Math.max(1, pageNumber || 1);
var totalItems = array.length;
var totalPages = Math.ceil(totalItems / pageSize);
var startIndex = (pageNumber - 1) * pageSize;
var endIndex = Math.min(startIndex + pageSize, totalItems);
return {
items: array.slice(startIndex, endIndex),
pagination: {
pageNumber: pageNumber,
pageSize: pageSize,
totalItems: totalItems,
totalPages: totalPages,
hasPrevious: pageNumber > 1,
hasNext: pageNumber < totalPages,
startIndex: startIndex,
endIndex: endIndex - 1
}
};
};
/**
* 数组去重 - 支持复杂对象的去重
* @param {Array} array - 源数组
* @param {string|Function} keySelector - 用于去重的键选择器
* @returns {Array} 去重后的数组
*/
AdvancedArrayUtils.prototype.distinct = function(array, keySelector) {
if (!Array.isArray(array)) throw new Error('参数必须是数组');
var seen = {};
var result = [];
var self = this;
array.forEach(function(item) {
self.performanceMetrics.operations++;
var key;
if (typeof keySelector === 'function') {
key = keySelector(item);
} else if (typeof keySelector === 'string') {
key = self.getFieldValue(item, keySelector);
} else {
key = item;
}
var keyString = String(key);
if (!seen.hasOwnProperty(keyString)) {
seen[keyString] = true;
result.push(item);
}
});
return result;
};
//===========================================
// AIWROK特定功能集成
//===========================================
/**
* UI控件批量处理 - 结合AIWROK的UI操作
* @param {Array} uiElements - UI元素数组
* @param {Function} processor - 处理函数
* @param {Object} options - 处理选项
*/
AdvancedArrayUtils.prototype.batchUIProcess = function(uiElements, processor, options) {
options = options || {};
var batchSize = options.batchSize || 10;
var delay = options.delay || 100;
var self = this;
console.log("开始批量处理 " + uiElements.length + " 个UI元素");
var batches = [];
for (var i = 0; i < uiElements.length; i += batchSize) {
batches.push(uiElements.slice(i, i + batchSize));
}
// 分批处理(AIWROK环境使用threads.sleep代替setTimeout)
for (var batchIndex = 0; batchIndex < batches.length; batchIndex++) {
var batch = batches[batchIndex];
console.log("处理第 " + (batchIndex + 1) + " 批,共 " + batch.length + " 个元素");
batch.forEach(function(element, index) {
try {
processor(element, index);
self.performanceMetrics.operations++;
} catch (e) {
console.log("处理UI元素失败: " + (e.message || e));
}
});
// 批次间延时
if (batchIndex < batches.length - 1) {
sleep.second(delay / 1000);
}
}
console.log("批量处理完成");
return this;
};
/**
* OCR结果智能筛选 - 结合AIWROK的OCR功能
* @param {Array} ocrResults - OCR识别结果数组
* @param {Object} filterOptions - 筛选选项
* @returns {Array} 筛选后的结果
*/
AdvancedArrayUtils.prototype.filterOCRResults = function(ocrResults, filterOptions) {
filterOptions = filterOptions || {};
var conditions = [];
// 文本长度过滤
if (filterOptions.minLength) {
conditions.push({
field: 'text',
operator: '>',
value: filterOptions.minLength
});
}
// 置信度过滤
if (filterOptions.minConfidence) {
conditions.push({
field: 'confidence',
operator: '>=',
value: filterOptions.minConfidence
});
}
// 文本内容过滤
if (filterOptions.contains) {
conditions.push({
field: 'text',
operator: 'contains',
value: filterOptions.contains
});
}
// 位置过滤
if (filterOptions.minX !== undefined) {
conditions.push({
field: 'x',
operator: '>=',
value: filterOptions.minX
});
}
return this.smartFilter(ocrResults, conditions);
};
/**
* 日志数据聚合分析 - 结合AIWROK的日志功能
* @param {Array} logEntries - 日志条目数组
* @param {Object} analysisConfig - 分析配置
* @returns {Object} 分析结果
*/
AdvancedArrayUtils.prototype.analyzeLogs = function(logEntries, analysisConfig) {
analysisConfig = analysisConfig || {};
var timeWindow = analysisConfig.timeWindow || 3600000; // 1小时
var logLevelWeights = analysisConfig.logLevelWeights || {
'ERROR': 10,
'WARN': 5,
'INFO': 1,
'DEBUG': 0.5
};
var currentTime = new Date().getTime();
var recentLogs = logEntries.filter(function(log) {
return currentTime - log.timestamp <= timeWindow;
});
var analysis = {
totalLogs: recentLogs.length,
levelDistribution: {},
errorRate: 0,
warningRate: 0,
healthScore: 100
};
// 统计日志级别分布
recentLogs.forEach(function(log) {
var level = log.level || 'INFO';
analysis.levelDistribution[level] = (analysis.levelDistribution[level] || 0) + 1;
});
// 计算错误率和警告率
var errorCount = analysis.levelDistribution['ERROR'] || 0;
var warnCount = analysis.levelDistribution['WARN'] || 0;
analysis.errorRate = analysis.totalLogs > 0 ? (errorCount / analysis.totalLogs) * 100 : 0;
analysis.warningRate = analysis.totalLogs > 0 ? (warnCount / analysis.totalLogs) * 100 : 0;
// 计算健康分数
var totalWeight = 0;
var weightedScore = 0;
for (var level in analysis.levelDistribution) {
if (analysis.levelDistribution.hasOwnProperty(level)) {
var count = analysis.levelDistribution[level];
var weight = logLevelWeights[level] || 1;
totalWeight += count * weight;
weightedScore += count * weight;
}
}
if (totalWeight > 0) {
analysis.healthScore = Math.max(0, 100 - (errorCount * 10) - (warnCount * 3));
}
return analysis;
};
//===========================================
// 使用示例和测试
//===========================================
function uiControlArrayExample() {
console.log("=== 示例1: UI控件数组操作 ===");
// 模拟通过findControls获取的UI控件数组
var uiControls = [
{ id: 'btn_login', type: 'Button', text: '登录', visible: true, enabled: true, x: 100, y: 200, width: 200, height: 80 },
{ id: 'btn_register', type: 'Button', text: '注册', visible: true, enabled: true, x: 100, y: 300, width: 200, height: 80 },
{ id: 'input_username', type: 'EditText', text: '', visible: true, enabled: true, x: 50, y: 100, width: 300, height: 60 },
{ id: 'input_password', type: 'EditText', text: '', visible: true, enabled: true, x: 50, y: 170, width: 300, height: 60 },
{ id: 'chk_remember', type: 'CheckBox', text: '记住密码', visible: true, enabled: true, x: 50, y: 250, width: 150, height: 40 },
{ id: 'txt_forgot', type: 'TextView', text: '忘记密码?', visible: true, enabled: true, x: 250, y: 250, width: 120, height: 40 },
{ id: 'btn_cancel', type: 'Button', text: '取消', visible: false, enabled: false, x: 100, y: 400, width: 200, height: 80 }
];
console.log("找到 " + uiControls.length + " 个UI控件");
// 1. 筛选所有可见且可用的按钮
var clickableButtons = [];
for (var i = 0; i < uiControls.length; i++) {
var ctrl = uiControls[i];
if (ctrl.type === 'Button' && ctrl.visible && ctrl.enabled) {
clickableButtons.push(ctrl);
}
}
console.log("可点击的按钮有 " + clickableButtons.length + " 个:");
for (var j = 0; j < clickableButtons.length; j++) {
console.log(" - " + clickableButtons[j].text + " (位置: " + clickableButtons[j].x + "," + clickableButtons[j].y + ")");
}
// 2. 查找特定文本的控件
var loginButton = null;
for (var k = 0; k < uiControls.length; k++) {
if (uiControls[k].text === '登录') {
loginButton = uiControls[k];
break;
}
}
if (loginButton) {
console.log("找到登录按钮:");
console.log(" ID: " + loginButton.id);
console.log(" 类型: " + loginButton.type);
console.log(" 位置: (" + loginButton.x + ", " + loginButton.y + ")");
console.log(" 尺寸: " + loginButton.width + "x" + loginButton.height);
console.log(" 中心点: (" + (loginButton.x + loginButton.width/2) + ", " + (loginButton.y + loginButton.height/2) + ")");
}
// 3. 批量计算控件中心坐标(用于点击操作)
console.log("所有输入框的中心坐标:");
for (var m = 0; m < uiControls.length; m++) {
var control = uiControls[m];
if (control.type === 'EditText') {
var centerX = control.x + control.width / 2;
var centerY = control.y + control.height / 2;
console.log(" " + control.id + ": (" + centerX + ", " + centerY + ")");
}
}
// 步骤间延时2秒
console.log("等待2秒...");
sleep.second(2);
}
/**
* 图像识别结果数组处理示例
*/
function imageRecognitionArrayExample() {
console.log("=== 示例2: 图像识别结果数组处理 ===");
// 模拟通过findImage或shapeSearch返回的识别结果数组
var recognitionResults = [
{ name: '登录按钮', confidence: 0.95, x: 150, y: 300, width: 180, height: 60, timestamp: new Date().getTime() },
{ name: '登录按钮', confidence: 0.92, x: 152, y: 298, width: 178, height: 62, timestamp: new Date().getTime() + 100 },
{ name: '提交按钮', confidence: 0.88, x: 200, y: 500, width: 160, height: 55, timestamp: new Date().getTime() + 200 },
{ name: '验证码图片', confidence: 0.75, x: 100, y: 400, width: 200, height: 80, timestamp: new Date().getTime() + 300 },
{ name: '登录按钮', confidence: 0.90, x: 148, y: 302, width: 182, height: 58, timestamp: new Date().getTime() + 400 }
];
console.log("识别到 " + recognitionResults.length + " 个目标");
// 1. 筛选高置信度的结果(>0.85)
var highConfidenceResults = [];
for (var i = 0; i < recognitionResults.length; i++) {
if (recognitionResults[i].confidence > 0.85) {
highConfidenceResults.push(recognitionResults[i]);
}
}
console.log("高置信度结果(>0.85)有 " + highConfidenceResults.length + " 个:");
for (var j = 0; j < highConfidenceResults.length; j++) {
var result = highConfidenceResults[j];
console.log(" - " + result.name + " (置信度: " + result.confidence + ", 位置: " + result.x + "," + result.y + ")");
}
// 2. 按名称分组统计
var groupedByName = {};
for (var k = 0; k < recognitionResults.length; k++) {
var item = recognitionResults[k];
if (!groupedByName[item.name]) {
groupedByName[item.name] = [];
}
groupedByName[item.name].push(item);
}
console.log("按名称分组统计:");
for (var name in groupedByName) {
if (groupedByName.hasOwnProperty(name)) {
var items = groupedByName[name];
console.log(" " + name + ": " + items.length + " 次匹配");
// 计算平均置信度
var totalConfidence = 0;
for (var m = 0; m < items.length; m++) {
totalConfidence += items[m].confidence;
}
var avgConfidence = totalConfidence / items.length;
console.log(" 平均置信度: " + avgConfidence.toFixed(3));
// 找到最佳匹配(最高置信度)
var bestMatch = items[0];
for (var n = 1; n < items.length; n++) {
if (items[n].confidence > bestMatch.confidence) {
bestMatch = items[n];
}
}
console.log(" 最佳匹配: (" + bestMatch.x + ", " + bestMatch.y + ") 置信度: " + bestMatch.confidence);
}
}
// 3. 计算多个匹配点的中心位置(用于提高点击精度)
var loginButtons = groupedByName['登录按钮'];
if (loginButtons && loginButtons.length > 0) {
var sumX = 0, sumY = 0;
for (var p = 0; p < loginButtons.length; p++) {
sumX += loginButtons[p].x + loginButtons[p].width / 2;
sumY += loginButtons[p].y + loginButtons[p].height / 2;
}
var centerX = sumX / loginButtons.length;
var centerY = sumY / loginButtons.length;
console.log("登录按钮的平均中心位置:");
console.log(" X: " + Math.round(centerX));
console.log(" Y: " + Math.round(centerY));
console.log(" 建议点击坐标: (" + Math.round(centerX) + ", " + Math.round(centerY) + ")");
}
// 步骤间延时2秒
console.log("等待2秒...");
sleep.second(2);
}
/**
* 任务队列数组调度示例
*/
function taskQueueArrayExample() {
console.log("=== 示例3: 任务队列数组调度 ===");
// 模拟任务队列数组
var taskQueue = [
{ id: 1, name: '打开应用', priority: 1, status: 'pending', duration: 2000 },
{ id: 2, name: '等待首页加载', priority: 2, status: 'pending', duration: 3000 },
{ id: 3, name: '点击登录按钮', priority: 3, status: 'pending', duration: 1000 },
{ id: 4, name: '输入用户名', priority: 4, status: 'pending', duration: 1500 },
{ id: 5, name: '输入密码', priority: 5, status: 'pending', duration: 1500 },
{ id: 6, name: '点击提交', priority: 6, status: 'pending', duration: 1000 },
{ id: 7, name: '验证登录结果', priority: 7, status: 'pending', duration: 2000 }
];
console.log("任务队列共有 " + taskQueue.length + " 个任务");
// 1. 按优先级排序
taskQueue.sort(function(a, b) {
return a.priority - b.priority;
});
console.log("按优先级排序后的任务列表:");
for (var i = 0; i < taskQueue.length; i++) {
var task = taskQueue[i];
console.log(" [" + task.priority + "] " + task.name + " (预计耗时: " + task.duration + "ms)");
}
// 2. 模拟执行任务队列
console.log("开始执行任务队列:");
var completedTasks = [];
var failedTasks = [];
for (var j = 0; j < taskQueue.length; j++) {
var currentTask = taskQueue[j];
console.log(" 执行任务 #" + (j+1) + ": " + currentTask.name);
// 模拟任务执行(成功率90%)
var success = Math.random() > 0.1;
if (success) {
currentTask.status = 'completed';
completedTasks.push(currentTask);
console.log(" ✓ 完成");
} else {
currentTask.status = 'failed';
failedTasks.push(currentTask);
console.log(" ✗ 失败");
}
// 任务间短暂延时
sleep.second(0.3);
}
console.log("");
console.log("任务执行统计:");
console.log(" 总任务数: " + taskQueue.length);
console.log(" 成功: " + completedTasks.length);
console.log(" 失败: " + failedTasks.length);
console.log(" 成功率: " + (completedTasks.length / taskQueue.length * 100).toFixed(1) + "%");
if (failedTasks.length > 0) {
console.log("");
console.log("失败的任务:");
for (var k = 0; k < failedTasks.length; k++) {
console.log(" - " + failedTasks[k].name);
}
}
// 步骤间延时2秒
console.log("等待2秒...");
sleep.second(2);
}
/**
* 设备信息数组管理示例
*/
function deviceInfoArrayExample() {
console.log("=== 示例4: 设备信息数组管理 ===");
// 模拟多设备信息数组
var devices = [
{ deviceId: 'device_001', model: '小米11', androidVersion: '12', screenWidth: 1080, screenHeight: 2400, battery: 85, online: true },
{ deviceId: 'device_002', model: '华为P40', androidVersion: '11', screenWidth: 1080, screenHeight: 2340, battery: 62, online: true },
{ deviceId: 'device_003', model: 'OPPO Reno6', androidVersion: '11', screenWidth: 1080, screenHeight: 2400, battery: 45, online: false },
{ deviceId: 'device_004', model: 'vivo X60', androidVersion: '12', screenWidth: 1080, screenHeight: 2376, battery: 90, online: true },
{ deviceId: 'device_005', model: '三星S21', androidVersion: '13', screenWidth: 1080, screenHeight: 2400, battery: 30, online: true }
];
console.log("设备列表共有 " + devices.length + " 台设备");
// 1. 筛选在线设备
var onlineDevices = [];
for (var i = 0; i < devices.length; i++) {
if (devices[i].online) {
onlineDevices.push(devices[i]);
}
}
console.log("在线设备: " + onlineDevices.length + " 台");
for (var j = 0; j < onlineDevices.length; j++) {
var device = onlineDevices[j];
console.log(" - " + device.model + " (电量: " + device.battery + "%, Android " + device.androidVersion + ")");
}
// 2. 查找低电量设备(<50%)
var lowBatteryDevices = [];
for (var k = 0; k < devices.length; k++) {
if (devices[k].battery < 50) {
lowBatteryDevices.push(devices[k]);
}
}
if (lowBatteryDevices.length > 0) {
console.log("低电量设备警告 (<50%): " + lowBatteryDevices.length + " 台");
for (var m = 0; m < lowBatteryDevices.length; m++) {
var lowDevice = lowBatteryDevices[m];
console.log(" ⚠ " + lowDevice.model + " - 电量: " + lowDevice.battery + "%");
}
} else {
console.log("所有设备电量充足");
}
// 3. 按Android版本分组
var versionGroups = {};
for (var n = 0; n < devices.length; n++) {
var dev = devices[n];
var version = 'Android ' + dev.androidVersion;
if (!versionGroups[version]) {
versionGroups[version] = [];
}
versionGroups[version].push(dev);
}
console.log("按Android版本分组:");
for (var version in versionGroups) {
if (versionGroups.hasOwnProperty(version)) {
var group = versionGroups[version];
console.log(" " + version + ": " + group.length + " 台设备");
for (var p = 0; p < group.length; p++) {
console.log(" - " + group[p].model);
}
}
}
// 4. 计算平均电量
var totalBattery = 0;
for (var q = 0; q < devices.length; q++) {
totalBattery += devices[q].battery;
}
var avgBattery = totalBattery / devices.length;
console.log("设备统计信息:");
console.log(" 平均电量: " + avgBattery.toFixed(1) + "%");
console.log(" 最高电量: " + Math.max.apply(Math, devices.map(function(d) { return d.battery; })) + "%");
console.log(" 最低电量: " + Math.min.apply(Math, devices.map(function(d) { return d.battery; })) + "%");
// 步骤间延时2秒
console.log("等待2秒...");
sleep.second(2);
}
//===========================================
// 主函数和执行入口
//===========================================
/**
* 运行所有示例
*/
function runAllExamples() {
try {
uiControlArrayExample();
imageRecognitionArrayExample();
taskQueueArrayExample();
deviceInfoArrayExample();
console.log("=== 所有示例执行完成 ===");
} catch (e) {
console.log("执行示例时发生错误: " + (e.message || e));
}
}
// 执行所有示例
runAllExamples();
复制代码
欢迎光临 自动发帖软件 (http://www.fatiegongju.com/)
Powered by Discuz! X3.2