【问题标题】:Creating a unique object on years and months based on array of dates根据日期数组创建年和月的唯一对象
【发布时间】:2021-06-17 11:12:45
【问题描述】:

我正在尝试根据一组日期创建一个独特的年月对象,请参阅下面的意思:

const availableDates = ["26-01-2022", "30-01-2022", "02-03-2022", "16-04-2022", "01-01-2023"]; // This list will be really long, just an example

我想使用 availableDates 创建一个像下面这样的唯一对象,但在试图弄清楚时遇到了问题:

const uniqueDates = {
  "2022": ["Jan", "Mar", "Apr"],
  "2023": ["Jan"]
};

如果你有更好的方法来实现这一点,请告诉我!

提前致谢

【问题讨论】:

  • 请编辑您的问题以显示您所做的研究以及您为自己解决问题所做的任何尝试

标签: javascript arrays javascript-objects


【解决方案1】:

我们可以使用 Array.reduce 创建所需的地图,并使用 Set 确保我们每年只保留一组唯一的月份。

const availableDates = ["26-01-2022", "30-01-2022", "02-03-2022", "16-04-2022", "01-01-2023", "01-01-2023"];

const months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
const uniqueDates = availableDates.reduce((acc, dt) => { 
    let [day, month, year] = dt.split("-");
    acc[year] = [...new Set(acc[year] || []).add(months[month - 1])];
    return acc;
}, {})


console.log("Unique object:", uniqueDates)

【讨论】:

  • Reduce 确实非常方便!祝项目好运!
  • 我奇怪地在一年中得到重复的月份,但只有一个重复,只是想调试它
  • 我会尝试重现该问题,我认为这可能是移动支架的情况!
  • 我想我已经解决了,如果最后两个日期在同一年和同一年,就会出现问题。
  • 感谢您的快速回复!我确实使用了 .includes 来查看它是否存在,但您的方法更简洁并保持 Set 功能,再次感谢!
【解决方案2】:

可能是这样的:

let month = {
  "01" : "Jan",
  "02" : "Feb",
  "03" : "Mar",
  "04" : "Apr",
  // ...
};
let res = ["26-01-2022", "30-01-2022", "02-03-2022", "16-04-2022", "01-01-2023"].reduce((acc, el) => {
   let arr = el.split("-");
   if( acc[arr[2]] && !acc[arr[2]].includes(month[arr[1]])){
      acc[arr[2]].push(month[arr[1]])
   } else if(!acc[el[2]]){
      acc[arr[2]] = [month[arr[1]]]
   }
   return acc;
}, {})
console.log(res)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-06
    • 1970-01-01
    • 2015-10-10
    • 1970-01-01
    • 1970-01-01
    • 2016-05-28
    • 2018-11-23
    • 2013-01-03
    相关资源
    最近更新 更多