如何实现日期数组去重并匹配对应每日最高花费数组?
问题解决:合并日期数组并计算每日最高花费
问题描述
现有两个数组,一个是日期数组,一个是当日花费数组:
var arrayOfDates = [01.07, 01.07, 03.07, 04.07, 05.07, 05.07, 05.07] var arrayofCosts = [3, 8, 2, 2, 8, 6, 9]
需要将arrayOfDates过滤为唯一元素,同时让第二个数组显示每日的最高花费,预期结果如下:
var arrayOfDatesModifed = [01.07, 3.07, 04.07, 05.07] var arrayofNumbersModifed = [8, 2, 2, 9]
需求分为三个阶段:
- 过滤
arrayOfDates得到唯一元素 - 为每个唯一日期找到
arrayofCosts中的对应项 - 找出每个日期对应的
arrayofCosts中的最大值
解决方案
可以通过对象映射的方式一次性完成三个阶段的任务,逻辑清晰且高效:
基础实现(不严格保证顺序)
// 创建映射对象,存储每个日期的最高花费 const dateCostMap = {}; for (let i = 0; i < arrayOfDates.length; i++) { const date = arrayOfDates[i]; const cost = arrayofCosts[i]; // 若日期未记录,或当前花费更高,则更新 if (!dateCostMap[date] || cost > dateCostMap[date]) { dateCostMap[date] = cost; } } // 提取目标数组 const arrayOfDatesModifed = Object.keys(dateCostMap).map(Number); // 转为数字类型,若需字符串可移除map(Number) const arrayofNumbersModifed = Object.values(dateCostMap);
保留原始顺序的实现
如果需要和日期首次出现的顺序完全一致,可调整为:
const dateCostMap = {}; const uniqueDatesOrder = []; for (let i = 0; i < arrayOfDates.length; i++) { const date = arrayOfDates[i]; const cost = arrayofCosts[i]; if (!dateCostMap[date]) { // 首次出现的日期,加入顺序数组 uniqueDatesOrder.push(date); dateCostMap[date] = cost; } else if (cost > dateCostMap[date]) { // 已存在的日期,更新最高花费 dateCostMap[date] = cost; } } // 生成目标数组 const arrayOfDatesModifed = uniqueDatesOrder; const arrayofNumbersModifed = uniqueDatesOrder.map(date => dateCostMap[date]);
逻辑说明
- 遍历两个数组,用对象记录每个日期的最高花费:每遇到一个日期,对比当前花费与对象中已存的最大值,保留较大值
- 基础实现通过
Object.keys()和Object.values()直接提取结果;顺序实现则额外维护一个数组记录日期首次出现的顺序,确保结果顺序与预期一致
内容的提问来源于stack exchange,提问作者Sergey_VC
相关产品推荐
相关产品推荐

