JavaScript中forEach内可以嵌套循环吗?还是使用独立循环更合适?
关于forEach嵌套循环的问题
- JavaScript 的
forEach内部完全可以嵌套其他循环,包括for循环、另一个forEach等,语法层面没有任何限制。 - 但就你当前的业务场景来说,分开使用独立循环的执行效率更高,代码可读性也更好:
- 如果你在遍历
uniformPieces的forEach里嵌套遍历标准制服数组的逻辑,时间复杂度是O(n*m)(n是现有制服数量,m是标准制服件数),数据量越大性能损耗越明显。 - 分开循环的话时间复杂度只有
O(n + m),只需要先遍历一次现有制服做数据聚合,再遍历标准制服数组做缺失校验即可。
- 如果你在遍历
- 额外说明:如果你的业务场景数据量极小(比如永远只有两家公司、两套制服),嵌套循环也不会有可感知的性能差异,但从代码可维护性和扩展性的角度考虑,还是更推荐分开循环的实现方式。
实现思路
- 第一步:先做数据聚合,遍历所有现有制服,拆分出公司名和对应的制服名称,把每个公司拥有的制服存在单独的
Set结构里,方便后续快速判断是否存在。 - 第二步:遍历所有公司的制服集合,逐个校验该公司的制服Set是否包含所有标准制服件。
- 第三步:返回第一个缺少制服件的公司名即可。
参考实现代码
function findCompanyName(uniformSet, uniformPieces) { const companyUniforms = {} // 第一次循环:聚合各公司已有制服,动态兼容任意数量公司 uniformPieces.forEach(item => { const [company, piece] = item.split('_') // 公司不存在则初始化 if (!companyUniforms[company]) companyUniforms[company] = new Set() companyUniforms[company].add(piece) }) // 第二次循环:校验哪家公司有缺失 for (const [company, havePieces] of Object.entries(companyUniforms)) { // 判断是否存在缺失的制服 const isLack = uniformSet.some(piece => !havePieces.has(piece)) if (isLack) return company } } // 测试用例 console.log(findCompanyName( ["shirt", "pants"], ["companyA_shirt", "companyA_pants", "companyB_shirt"] )) // 输出 companyB
内容的提问来源于stack exchange,提问作者new_be_Jeff
相关产品推荐
相关产品推荐

