如何用filter、some等数组函数重构嵌套循环代码?代码优化咨询
如何用数组方法重构嵌套循环的筛选逻辑?
当然可以用filter和some这类数组方法来重构你的代码,不仅更简洁,还能提升可读性和效率。先直接给你重构后的代码:
const availableItems = [{ "metric": "USD", "code": "USDONE", "quantity": "1" }, { "metric": "AUD", "code": "AUDTHREE", "quantity": "3" }, { "metric": "AFN", "code": "AFNTWO", "quantity": "1" }, { "metric": "ALL", "code": "ALLSIX", "quantity": "1" }, { "metric": "INR", "code": "INRTWO", "quantity": "1" }]; const masterSet = [{ "uri": "marty-cruz.html", "name": "marty-cruz", "isVisible": false, "skuCodes": ["USDONE", "USDTWO", "USDTHREE"] }, { "uri": "deanne-daniels.html", "name": "deanne-daniels", "isVisible": false, "skuCodes": ["AUDONE", "AUDTWO", "AUDTHREE"] }, { "uri": "sallie-pachecok.html", "name": "sallie-pachecok", "isVisible": false, "skuCodes": ["AFNTWO"] }, { "uri": "lillia-paul.html", "name": "lillia-paul", "isVisible": false, "skuCodes": ["ALLONE", "ALLFOUR", "ALLSIX"] }, { "uri": "ken-johnston.html", "name": "ken-johnston", "isVisible": false, "skuCodes": ["INRTWO"] }, { "uri": "mary-stanton.html", "name": "mary-stanton", "isVisible": false, "skuCodes": ["RODEWQ667"] }, { "uri": "edwardo-brooks.html", "name": "edwardo-brooks", "isVisible": false, "skuCodes": ["PADFER456"] }]; // 先提取所有可用的code到Set中,大幅提升查找效率 const availableCodes = new Set(availableItems.map(item => item.code)); // 用filter筛选符合条件的masterSet条目 const filteredResult = masterSet.filter(mainItem => mainItem.skuCodes.some(code => availableCodes.has(code)) ); console.log(filteredResult);
关于原代码的可读性和效率分析:
- 可读性:原嵌套循环逻辑虽然清晰,但写法偏命令式,需要逐行理解循环执行过程。而数组方法的链式调用属于函数式写法,能直接表达“筛选出skuCodes包含可用code的条目”这个核心意图,代码更简洁易懂,也更符合现代JS的编码风格。
- 效率:原代码的嵌套循环时间复杂度是
O(m*n*k)(m是availableItems长度,n是masterSet长度,k是skuCodes数组的平均长度),因为每次调用includes都要遍历skuCodes数组。重构后的代码先把可用code存入Set(查找时间复杂度O(1)),总复杂度降到O(m + n*k),当数据量较大时,效率提升会非常明显。
另外,原代码还有一个潜在问题:如果同一个masterSet条目匹配到多个availableItems的code,会被多次推入value数组,导致结果出现重复。而重构后的filter方法会保证每个符合条件的条目只出现一次,这应该更贴合你的实际需求。
内容的提问来源于stack exchange,提问作者SubSul
相关产品推荐
相关产品推荐

