【问题标题】:Filter date in object过滤对象中的日期
【发布时间】:2020-03-01 12:35:50
【问题描述】:

我有:

var date = [{date: '24.05.2019'}, {date: '27.05.2019'}, {date: '30.05.2019'}, {date: '01.06.2019'}, {date: '02.06.2019'}, {date: '05.06.2019'}, {date: '07.06.2019'}]

如何获得:

2019 年 5 月 24 日、27 日、30 日

2019 年 6 月 1 日、02 日、05 日、07 日

【问题讨论】:

  • 请添加您尝试过的代码

标签: javascript node.js reactjs react-native object


【解决方案1】:

您也可以使用 map 和 reduce 而不是 for 循环来做到这一点:

var date = [{ date: '24.05.2019' },{ date: '27.05.2019' },{ date: '30.05.2019' },{ date: '01.06.2019' },{ date: '02.06.2019' },{ date: '05.06.2019' },{ date: '07.06.2019' },{ date: '24.05.2020' }];

var monthNames = ['January','February','March','April','May','June','July','August','September','October','November','December',];
console.log(
  [
    ...date
      .map(d => d.date.split('.').map(Number))
      .sort(
        (a, b) => a[2] - b[2] || a[1] - b[1] || a[0] - b[0]
      )
      .reduce(
        (result, [d, m, y]) =>
          result.set(
            `${monthNames[m]} ${y}`,
            (
              result.get(`${monthNames[m]} ${y}`) || []
            ).concat(d)
          ),
        new Map()
      )
      .entries(),
  ].map(([ym, days]) => `${days.join(',')} ${ym}`)
);

【讨论】:

    【解决方案2】:

    这不会很漂亮,因为对于普通的 Date 对象,这些日期没有以可消化的方式格式化......所以字符串拆分它是:

    const monthNames = ["January", "February", "March", "April", "May", "June",
      "July", "August", "September", "October", "November", "December"
    ];
    var date = [{date: '24.05.2019'}, {date: '27.05.2019'}, {date: '30.05.2019'}, 
    {date: '01.06.2019'}, {date: '02.06.2019'}, {date: '05.06.2019'}, {date: 
    '07.06.2019'}]
    const sortedMonthCollection = []
    monthNames.map(month => sortedMonthCollection.push([month]))
    
    date.map(({ date }) => {
    
        const monthIndex = monthNames[parseInt(date.substr(3, 2))-1];
    
        sortedMonthCollection[parseInt(date.substr(3, 
     2))-1].unshift(parseInt(date.substr(0, 2)))
    
    })
    

    【讨论】:

    • 我建议在您对sortedMonthCollection 进行变异时使用date.forEach。您通常不会在他的地图回调中发生变异,而是返回一个新值。
    【解决方案3】:

    请尝试以下代码。

    var formatDate = function(dates) {
        var monthMap = [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ];
    
        var tempDateArray = dates.map(d => d.date);
    
        var finalJson = {};
        tempDateArray.forEach(d => {
            const currentKey = d.substr(3);
            if (!Object.keys(finalJson).includes(currentKey)) {
                finalJson[currentKey] = [];
            }
    
            finalJson[currentKey].push(d.substr(0, 2));
        });
    
        return Object.keys(finalJson).map(key => {
            return finalJson[key].join(', ') + ' ' + monthMap[(parseInt(key.substr(0, 2)) - 1)] + ' ' + key.substr(3);
        });
    };
    
    var date = [{date: '24.05.2019'}, {date: '27.05.2019'}, {date: '30.05.2019'}, {date: '01.06.2019'}, {date: '02.06.2019'}, {date: '05.06.2019'}, {date: '07.06.2019'}];
    
    console.log(formatDate(date));
    

    【讨论】:

    • 你应该使用if (!Object.keys(finalJson).includes(currentKey)) { 而不是if (!finalJson[currentKey]) {
    猜你喜欢
    • 2021-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-05
    • 1970-01-01
    • 2022-11-17
    • 2014-09-04
    • 2014-07-25
    相关资源
    最近更新 更多