计算JS数组中重复的Date对象

问题描述

我尝试了以下解决方案:herehere,但我的问题还有一些其他复杂性-比较日期。

问题:计算JS数组中重复的Date()对象。日期对象具有不同的时间,但重要的是日期,月份和年份相同。例如3 \ 3 \ 2020 14:30和3 \ 3 \ 202 12:21应该算作同一日期。

数据集(输入):

let dates = [new Date(2018,11,24,22),new Date(2018,12,23),new Date(2013,02,3),23,3,22)]

预期输出

var result = [
         { 'date': dateobj0,'count':3; },{ 'date': dateobj1,'count':4; },{ 'date': dateobj2,'count':10; },...
         { 'date': dateobjn,'count':n; },]

我从映射它们开始:

var result = {'date':'','count':0};
let mapedDatesList= dates.map(x => {result['date'] = x; return result} )

然后,我尝试修改上面列出的\实现解决方案,但没有成功。我所能得到的最好的是一些气泡排序情况,这是行不通的...。有人可以通过forEach或map提供更优雅的解决方案吗?

let mapedDatesList= dates.map(x => {result['date'] = x;  return result} )

console.log(mapedDatesList)


mapedDatesList.forEach( (x,i) => x.count != 0 ? mapedDatesList[i].count++:  x.count++ )

console.log('-----')

console.log(mapedDatesList)

完全陷在隧道视野中。每次在每个对象中触发forEach时,这种情况就很重要。

解决方法

也许有以下帮助:.tox-tinymce { border:none !important; } 表达式存在一些问题。预期月份为基于零的索引,即。 e。 new Date()表示一月等。

0

对象const dates=[new Date(2018,11,23),new Date(2013,1,3),new Date(2018,10,24,22),23,3,22)]; let dupes=dates.reduce((a,c)=>{ let d=c.toDateString(); a[d]=a[d]?a[d]+1:1; return a;},{}); console.log(dupes)当前列出所有日期及其计数。如果您要排除唯一日期,则可以再次对其进行过滤。

以下是带有过滤的重复日期对象的完整解决方案:

dupes

,

一种替代方法,尽管更复杂的解决方案是进行常规分组,然后根据需要汇总组。如果您有要包含在汇总中的结构化数据,则可以增加灵活性。

const dates = [
  new Date(2018,12,02,22)
];

const groupBy = (values,selector) => {
  const groups = new Map();
  
  for (let value of values) {
    const key = selector(value);
    const entry = groups.get(key);
    
    if (entry != null) {
        entry.values.push(value);
    } else {
        groups.set(key,{ key,values: [value] });
    }
  }
  
  return Array.from(groups.values());
};

const toDay = (date) => {
    return new Date(date.getFullYear(),date.getMonth(),date.getDate());
};

const result = groupBy(dates,(date) => toDay(date).getTime())
  .map(g => {
    return { date: new Date(g.key),count: g.values.length }
  });

console.log(result);

聚合结构化数据也很简单。

const data = [
  { date:  new Date(2018,text: 'a'},{ date:  new Date(2018,24 ),text: 'b'},25,22 ),text: 'c'},9 ),text: 'd'},];

const dataByDate = groupBy(data,(d) => toDay(d.date).getTime())
  .map((g) => {
    return {
      date: new Date(g.key),count: g.values.length,values: g.values.map((v) => v.text)
    };
  });
  
console.log(dataByDate);
,
let dates = [new Date(2018,22)];

const count ={};
dates.map(date => {
    date.setTime(0);
    return date;
}).forEach(date => count[date.toDateString()] = count[date.toDateString()] + 1 || 1);
console.log(count);