如何找出两个JavaScript对象数组的重复值?解决累加时重复问题
解决JavaScript日期数组值合并的重复值问题
看起来你遇到的重复值问题,大概率是因为嵌套遍历的时候没做高效的日期匹配,或者不小心对同一个日期的value进行了多次累加。我来给你个靠谱的解决方案:
核心思路
先把actualDateRange转换成一个以日期为键的映射(Map),这样可以快速查找每个日期对应的总value(还能顺便处理actualDateRange里可能存在的重复日期),然后遍历fullDateRange,直接从映射里取对应的值替换即可,完全避免重复累加的问题。
完整代码实现
var fullDateRange = [{date:"4/1/18",value:0},{date:"4/2/18",value:0},{date:"4/3/18",value:0},{date:"4/4/18",value:0},{date:"4/5/18",value:0}]; var actualDateRange = [{date:"4/1/18",value:1},{date:"4/3/18",value:3},{date:"4/5/18",value:5}]; function outputDeltaDates(fullDateObj, responseObj) { // 1. 构建日期-累计值的映射 const dateValueMap = new Map(); responseObj.forEach(item => { // 如果日期已存在,累加value;否则初始化 const currentTotal = dateValueMap.get(item.date) || 0; dateValueMap.set(item.date, currentTotal + item.value); }); // 2. 遍历完整日期数组,替换对应值 return fullDateObj.map(fullItem => ({ ...fullItem, // 复制原对象,避免修改原数组产生副作用 value: dateValueMap.get(fullItem.date) || fullItem.value })); } // 测试调用 const mergedResult = outputDeltaDates(fullDateRange, actualDateRange); console.log(mergedResult);
代码说明
- Map映射:把
actualDateRange的日期和对应value(如果有重复日期则累加)存起来,查找效率是O(1),比嵌套循环的O(n*m)高效得多。 - 返回新数组:用
map创建新数组,不会修改原有的fullDateRange,避免意外的副作用。 - 处理边界情况:如果
actualDateRange里有重复的日期,会自动累加它们的value;如果某个日期在actualDateRange里不存在,就保留fullDateRange里的原始value。
为什么你的原代码会出现重复值?
大概率是你用了嵌套循环(比如fullDateObj.forEach里嵌套responseObj.forEach),而且每次匹配到日期就直接累加fullItem.value。如果responseObj里有重复的日期,或者循环逻辑没做终止处理,就会导致同一个fullItem.value被多次累加,出现重复值。用Map的方式可以从根源上避免这个问题。
内容的提问来源于stack exchange,提问作者danywigglebutt
相关产品推荐
相关产品推荐

