如何根据时间和优先级生成队列? [已关闭]

问题描述 投票:0回答:1

我有物品清单:

[
    {
        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
    }
]

我明白,我需要以某种方式利用按优先级和开始/结束时间排序,但我什至不知道从哪里开始。

javascript sorting queue priority-queue
1个回答
0
投票

你可以试试这个:

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 }];
© www.soinside.com 2019 - 2024. All rights reserved.