接口内string数组长度读取与过滤问题求助
解决思路与优化代码
我看了你的代码,问题出在循环嵌套的逻辑上——你在for循环里又套了forEach,每次碰到符合长度条件的元素时,都会把整个listaGrupo重新遍历一遍,这不仅会导致重复添加,还完全偏离了你只处理当前符合条件元素的初衷。
核心问题分析
原代码的逻辑错误在于:
- 当第一个元素的
chave长度符合条件时,就会遍历全部元素并添加对应值,而不是只处理当前符合条件的元素 - 多次嵌套遍历会导致重复添加相同值,即使你用
includes检查,也会做很多无用功
优化方案
我们可以换个更清晰高效的思路:
- 遍历每个元素一次,根据
chave的长度提取对应位置的字符串 - 利用
Set自动去重(比数组includes效率更高) - 最后把
Set转换回数组得到结果
方案一:forEach + Set(可读性高)
// 创建Set自动去重 const uniqueValues = new Set<string>(); listaGrupo.forEach(item => { const chaveLen = item.chave.length; let target: string | undefined; // 根据长度匹配要提取的索引 if (chaveLen === 3) { target = item.chave[1]; } else if (chaveLen === 4) { target = item.chave[2]; } else if (chaveLen === 5) { target = item.chave[3]; } // 提取到有效值则加入Set if (target) { uniqueValues.add(target); } }); // 转换为数组 const arrayFiltrada = Array.from(uniqueValues);
方案二:链式调用(更简洁)
如果你喜欢更紧凑的写法,可以用map+filter+Set的链式组合:
const arrayFiltrada = Array.from( new Set( listaGrupo .map(item => { switch(item.chave.length) { case 3: return item.chave[1]; case 4: return item.chave[2]; case 5: return item.chave[3]; default: return null; // 不符合长度的返回null,后续过滤掉 } }) .filter(val => val !== null) ) );
验证预期结果
针对你的示例数据:
- 第一个元素
chave长度为3,会提取索引1的AUTOLEITURA - 如果有长度为4的元素,会提取索引2的
PEDIDO_LIGACAO
最终arrayFiltrada会包含去重后的目标字符串,完全符合你的预期。
内容的提问来源于stack exchange,提问作者Emmanuel Oliveira
相关产品推荐
相关产品推荐

