问题描述
我尝试了以下解决方案:here和here,但我的问题还有一些其他复杂性-比较日期。
问题:计算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);