如何解决嵌套循环匹配对象数组时重复生成结果的问题
解决数组关联时生成重复对象的问题
我完全懂你遇到的麻烦——之前用嵌套循环的时候,每次温度数组里的time不匹配就往结果里推一个对象,导致同一个事件出现好多次重复条目对吧?咱们换个更高效也更简洁的思路,就能轻松解决这个问题。
优化后的解决方案
核心思路是先把温度数组转换成以time为键的映射表,这样查找每个事件对应的温度时,不用再嵌套循环,而且每个事件只需要处理一次,自然就不会有重复了。
function getDataToDisplay(testArr1, testArr2) { // 将温度数组转换为 time -> temp 的映射,实现O(1)快速查找 const tempLookup = testArr2.reduce((acc, current) => { acc[current.time] = current.temp; return acc; }, {}); // 遍历事件数组,每个事件仅生成一个结果对象 return testArr1.map(event => { const matchedTemp = tempLookup[event.time]; return { event: event.event, time: event.time, temp: matchedTemp !== undefined ? matchedTemp : "no matching data found" }; }); }
为什么这个方法能解决问题?
- 避免嵌套循环的重复操作:
之前的嵌套循环会让每个事件和温度数组的每一项做对比,只要不匹配就推一次对象,导致同一个事件被多次添加到结果里。现在我们先把温度数据转成映射表,每个事件只需要查一次映射表,生成一个对象。 - 效率更高:
原来的嵌套循环时间复杂度是O(n*m)(n是事件数,m是温度条目数),现在转换成映射表是O(m),遍历事件是O(n),整体复杂度降到O(n+m),数据量越大优势越明显。 - 逻辑更清晰:
代码分成两步:先做数据预处理,再生成结果,每一步的职责明确,也更容易维护。
测试验证
用你提供的测试数组调用这个函数,会得到完全符合预期的结果:
const testArr1 = [ { event: "Ryan's birthday", time: "4:00", }, { event: "Steves's birthday", time: "2:00", }, { event: "Helen's birthday", time: "1:00", }, { event: "Paola's birthday", time: "3:00", }, { event: "Jared's birthday", time: "9:00", }, ]; const testArr2 = [ { time: "4:00", temp: 41, }, { time: "6:00", temp: 42, }, { time: "8:00", temp: 43, }, { time: "1:00", temp: 44, }, { time: "3:00", temp: 45, }, { time: "9:00", temp: 46, }, ]; console.log(getDataToDisplay(testArr1, testArr2));
输出结果:
[ { event: "Ryan's birthday", time: "4:00", temp: 41 }, { event: "Steves's birthday", time: "2:00", temp: "no matching data found" }, { event: "Helen's birthday", time: "1:00", temp: 44 }, { event: "Paola's birthday", time: "3:00", temp: 45 }, { event: "Jared's birthday", time: "9:00", temp: 46 } ]
每个事件只出现一次,匹配成功的显示对应温度,匹配失败的正确标记为"no matching data found"。
内容的提问来源于stack exchange,提问作者elderlyman
相关产品推荐
相关产品推荐

