我有物品清单:
[
{
id: 1,
priority: 1,
startTime: 0,
endTime: 57000
},
{
id: 2,
priority: 2,
startTime: 15000,
endTime: 25000
},
{
id: 3,
priority: 3,
startTime: 17000,
endTime: 32000
},
]
我想根据优先级和时间范围生成队列,范围从 0 到 86400(一天的秒数)。如果有空间隙,也应该添加,但 id 为空。
[
{
id: 1,
priority: 1,
startTime: 0,
endTime: 15000
},
{
id: 2,
priority: 2,
startTime: 15000,
endTime: 17000
},
{
id: 3,
priority: 3,
startTime: 17000,
endTime: 32000
},
{
id: 1,
priority: 1,
startTime: 32000,
endTime: 57000
},
{
id: null,
priority: null,
startTime: 32000,
endTime: 86400
}
]
我明白,我需要以某种方式利用按优先级和开始/结束时间排序,但我什至不知道从哪里开始。
你可以试试这个:
const tasks = [
{
id: 1,
priority: 1,
startTime: 0,
endTime: 57000,
},
{
id: 2,
priority: 2,
startTime: 15000,
endTime: 25000,
},
{
id: 3,
priority: 3,
startTime: 17000,
endTime: 32000,
},
];
const sortedTasks = tasks.sort((a, b) => b.priority - a.priority);
const dayMoments = [];
for (var i = 0; i < 86400; i++) dayMoments.push(i);
const momentsByTask = dayMoments.map((m) => {
const task = sortedTasks.find(
(item) => item.startTime <= m && item.endTime > m
);
return task ? task.id : null;
});
const result = momentsByTask.reduce(
(acc, item, index) => {
if (acc[acc.length - 1].id === item) return acc;
const last = acc.pop();
return [
...acc,
{ ...last, endTime: index },
{
id: null,
priority: null,
...(tasks.find((i) => i.id === item) ?? {}),
startTime: index,
endTime: index + 1,
},
];
},
[tasks.find((i) => i.id === momentsByTask[0])]
);
const last = result.pop();
const finalRes = [...result, { ...last, endTime: 86400 }];