如何在Crossfilter中按当日及昨日日期自动筛选数据?
嗨,很高兴能帮到你!针对你用Crossfilter筛选当日、昨日数据做图表对比的需求,我来给你梳理具体实现方法:
1. 先写一个日期格式化工具函数
Crossfilter的filterExact要求筛选值和数据中的日期格式完全匹配(比如你示例里的"1.1.2018"),所以我们需要一个能生成对应格式日期字符串的函数,还支持偏移天数(0=当日,-1=昨日):
// 生成指定偏移天数的日期字符串(格式:日.月.年,和你的示例格式一致) function getTargetDate(offsetDays = 0) { const currentDate = new Date(); // 调整日期:offsetDays为0是今天,-1是昨天,1是明天,以此类推 currentDate.setDate(currentDate.getDate() + offsetDays); const day = currentDate.getDate(); const month = currentDate.getMonth() + 1; // 注意:JS里月份是0-11,所以要加1 const year = currentDate.getFullYear(); // 返回和你数据匹配的日期格式 return `${day}.${month}.${year}`; }
2. 用函数获取当日/昨日日期,应用到Crossfilter
有了工具函数,就能轻松拿到需要筛选的日期,然后分别给两张图表生成统计数据:
// 获取当日、昨日的格式化日期字符串 const today = getTargetDate(); const yesterday = getTargetDate(-1); // 图表1:筛选当日数据,计算总和(记得把d.value换成你实际的数值字段) const countToday = Dim2.filterExact(today).group().reduceSum(d => d.value); // 图表2:筛选昨日数据,计算总和 const countYesterday = Dim2.filterExact(yesterday).group().reduceSum(d => d.value);
小提示:适配不同日期格式
如果你的数据日期格式不是日.月.年(比如常见的YYYY-MM-DD),只需要修改getTargetDate的返回格式即可,比如:
// 生成YYYY-MM-DD格式的日期(带前导零) function getTargetDate(offsetDays = 0) { const currentDate = new Date(); currentDate.setDate(currentDate.getDate() + offsetDays); const day = currentDate.getDate().toString().padStart(2, '0'); const month = (currentDate.getMonth() + 1).toString().padStart(2, '0'); const year = currentDate.getFullYear(); return `${year}-${month}-${day}`; }
关键要保证生成的日期字符串和你Crossfilter数据源里的日期字段完全一致,包括分隔符、数字位数(比如1月是"1"还是"01"),这样filterExact才能精准匹配。
祝你图表制作顺利,新年快乐!
内容的提问来源于stack exchange,提问作者BVB1392
相关产品推荐
相关产品推荐

