Javascript 按条件减少和分组
我有一个计算同时发生的最大事件(HH:mm)的函数。下面的示例有三个事件同时发生。我想将事件分组,如下面的示例 结果应该是: 数字会议00:00-01.00Javascript 按条件减少和分组,javascript,arrays,css-grid,reduce,Javascript,Arrays,Css Grid,Reduce,我有一个计算同时发生的最大事件(HH:mm)的函数。下面的示例有三个事件同时发生。我想将事件分组,如下面的示例 结果应该是: 数字会议00:00-01.00 第一组: 支持00.00-00.25 第2组: 预订会议00:30-01:30 个人会议00:30-01:30 到目前为止,我只能找到一个单一事件的发生。我想我必须使用减速器和条件 let事件=[ { id:9, 起点:0, 完:60,, 标题:“数字会议” }, { id:80, 开始时间:30, 完:90,, 标题:“图书会议”
- 第一组:
支持00.00-00.25 - 第2组:
预订会议00:30-01:30
个人会议00:30-01:30
let事件=[
{
id:9,
起点:0,
完:60,,
标题:“数字会议”
},
{
id:80,
开始时间:30,
完:90,,
标题:“图书会议”
},
{
id:81,
开始时间:30,
完:90,,
标题:“个人会议”
},
{
id:84,
起点:0,
完:24,,
标题:“支持”
}]
events.forEach(项目=>{
//找到匹配项
const matchedItems=events.filter(o=>{
返回o.start=item.start&&item.id!==o.id;
});
log(`Matched for${item.id}`,matchedItems)
//从事件数组中删除匹配项,以避免重复
//移除(匹配项);
//设置项目格式并将其放置在日历网格中
//格式([item,…matchedItems]);
});代码>我为您实现了一个函数,请参见下面的代码,欢迎使用
//计算两个事件是否重叠,无论它们的顺序如何
功能重叠(eventA、eventB){
//排序输入
const[first,second]=[eventA,eventB].sort((a,b)=>a.start-b.start);
//检查事件是否重叠
常数重叠=first.end>second.start;
返回重叠;
}
//使用组创建贴图对象
//也按时间排序
//每个组都包含事件对象
函数findVerlaps(事件、查询){
//结果
常量组={};
//事件来为其生成组
const queryEvent=events.find(e=>e.title==query);
//要检查的其他事件与查询的事件重叠
const eventsWithoutQuery=events.filter(e=>e.title!==query);
eventsWithoutQuery.forEach(事件=>{
const overlaps=重叠(事件、查询事件);
//如果有重叠
如果(重叠){
//构造组名
const groupName=`${event.start}-${event.end}`;
//如果组alread存在,请使用它,否则创建一个空组(数组)
常量组=组[groupName]?组[groupName]:[];
组推(事件);
//将组放回组映射并相应地命名
组[组名]=组;
}
});
//确保组中的键已排序(可选)
const sortedKeys=Object.key(groups.sort();
const sortedGroups=sortedKeys.reduce(
(会计科目,当前)=>({
…acc,
[当前]:组[当前]
}),
{}
);
//返回排序映射
返回分类组;
}
//事件
让事件=[
{
id:9,
起点:0,
完:60,,
标题:“数字会议”
},
{
id:80,
开始时间:30,
完:90,,
标题:“图书会议”
},
{
id:81,
开始时间:30,
完:90,,
标题:“个人会议”
},
{
id:84,
起点:0,
完:24,,
标题:“支持”
}
];
log(“迭代数字会议组”);
//构建“数字会议”小组
const groups=findOverlaps(事件,“数字会议”);
//迭代数字会议的重叠地图
对象项(组)的常量[groupName,eventsOfGroup]{
日志(groupName,eventsOfGroup);
}
log(“迭代所有内容”);
events.forEach(e=>{
console.log(“组:”+e.title);
对于(Object.entries(findOverlaps(events,e.title))的常量[groupName,eventsOfGroup]){
日志(groupName,eventsOfGroup);
}
});