如何从嵌套循环中输出多个单元格?附相关代码示例
实现嵌套循环中输出匹配字段的多个单元格
我来帮你完善这段代码,实现找到匹配指定字段的单元格并输出的功能。核心思路是遍历每个单元格,清理内容后和fields里的字段值做匹配,匹配成功时输出单元格信息或者存入结果对象。
完整修改后的代码
start() { // 自动生成A-Z列,不用手动逐个输入 const columns = Array.from({length:26}, (_,i) => String.fromCharCode(65+i)); let fields = { id: ['Medlemsnummer'], name: ['Namn'], // 可以在这里添加更多字段映射,比如 email: ['E-post'] }; let out = {}; let self = this; // 提前初始化结果容器,避免后续添加数据时出现undefined Object.keys(fields).forEach(key => { out[key] = []; }); columns.forEach(function(column) { for(let row = 1; row < 101; row++) { let cell = column + row; let d_cell = self.worksheet[cell]; let val_cell = (d_cell ? d_cell.v : ' '); let cell_string = val_cell.toString().toLowerCase(); // 移除换行、回车并去除首尾空白,统一格式方便匹配 let cellString_stripped = cell_string.replace(/(?:\n|\r|\r\n)/g, '').trim(); // 内层循环:匹配fields中的字段 for (var key in fields) { // 跳过Object原型链上的属性,避免不必要的遍历 if (!fields.hasOwnProperty(key)) continue; // 遍历当前字段对应的所有匹配文本(支持一个字段对应多个匹配值) fields[key].forEach(fieldValue => { const normalizedField = fieldValue.toLowerCase().trim(); if (cellString_stripped === normalizedField) { // 实时输出匹配到的单元格信息 console.log(`找到匹配字段「${key}」的单元格:${cell},内容:${val_cell}`); // 同时将结果存入out对象,方便后续批量处理 out[key].push({ cellPosition: cell, originalValue: val_cell }); } }); } } }); // 遍历结束后输出所有匹配结果的汇总 console.log('所有匹配结果汇总:', out); }
关键修改说明
- 自动生成列名:用
Array.from自动生成A-Z列,不用手动逐个输入,更简洁高效 - 统一匹配格式:对单元格内容和字段值都做了小写、去空白处理,避免因大小写或换行导致的匹配失败
- 完善结果存储:提前初始化
out对象的字段数组,确保后续可以正常存入匹配数据 - 灵活匹配支持:支持一个字段对应多个匹配文本(比如
id可以同时匹配「Medlemsnummer」和「会员编号」) - 双重输出方式:既在控制台实时打印匹配到的单元格,又把结果存入对象,兼顾即时查看和后续批量处理需求
扩展小技巧
- 如果需要模糊匹配(比如单元格内容包含字段文本,而非完全相等),可以把
===替换成includes:if (cellString_stripped.includes(normalizedField)) { // 匹配逻辑不变 } - 如果只需要输出单元格位置(比如A1、B5),可以简化输出语句为
console.log(cell)
内容的提问来源于stack exchange,提问作者J.Wennergren
相关产品推荐
相关产品推荐

