You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何找出两个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:33:16