如何过滤二维数组以保留每个ID对应的最新日期元素
解决方案:过滤数组保留每个ID的最新日期元素
没问题,咱们可以分两步来实现这个需求:先找出每个ID对应的最新日期,再基于这个日期筛选出符合条件的元素。下面是完整的代码实现:
var arr = [[1, "3/20/2018", "A"], [1, "3/20/2018", "B"], [1, "4/20/2018", "A"], [1, "4/20/2018", "B"], [2, "1/30/2018", "A"], [2, "1/30/2018", "B"], [2, "3/30/2018", "A"], [2, "3/30/2018", "B"]]; // 第一步:创建一个对象,存储每个ID对应的最新日期 const latestDates = {}; arr.forEach(item => { const id = item[0]; const date = new Date(item[1]); // 如果当前ID还没记录,或者当前日期比已记录的更新,就更新 if (!latestDates[id] || date > new Date(latestDates[id])) { latestDates[id] = item[1]; } }); // 第二步:筛选出每个ID下日期等于最新日期的元素 const result = arr.filter(item => { return item[1] === latestDates[item[0]]; }); console.log(result); // 输出:[[1, "4/20/2018", "A"], [1, "4/20/2018", "B"], [2, "3/30/2018", "A"], [2, "3/30/2018", "B"]]
代码解释:
- 第一步构建最新日期映射:我们遍历原数组,把每个元素的ID作为键,日期作为值。每次遇到同一个ID的元素时,就将当前日期和已存储的日期转换成
Date对象比较大小,保留更新的那个日期。这样latestDates里就存了每个ID对应的最新日期字符串。 - 第二步筛选元素:再次遍历原数组,只保留那些元素的日期和对应ID在
latestDates里存储的最新日期完全匹配的项,这样就得到了我们想要的结果。
这种方法的优势是只需要遍历数组两次,时间复杂度是O(n),效率比较高,而且逻辑清晰易懂。
内容的提问来源于stack exchange,提问作者ltp
相关产品推荐
相关产品推荐

