次の問題のパフォーマンス関数を作成する際に問題があります。私はタイムテーブルを作成しています。列の項目の配列を分割して、開始/終了時間の範囲で1時間を共有する2つの項目がないようにする必要があります。遅いアルゴリズムを改善するフィードバック
現在のソリューションは機能しますが、すべてのアイテムが同じ時間範囲を持ち、各アイテムごとに新しい列が作成される最悪の場合には、特に無駄な計算が行われます。
function getItemsPerColumn(items) {
let itemsPerHour = {},
itemsPerColumn = {},
itemsCount = items.length,
currentHour = 8,
columnIndex = 1;
items.forEach(item => {
let start = moment(item.startHour),
end = moment(item.endHour),
startHour = start.format('H'),
endHour = end.format('H');
if (itemsPerHour[startHour] === undefined) { itemsPerHour[startHour] = []; }
itemsPerHour[startHour].push({
rowStart: startHour,
rowEnd: endHour,
item: item
});
});
while (itemsCount > 0) {
if (itemsPerHour[currentHour] !== [] && itemsPerHour[currentHour] !== undefined) {
if (itemsPerColumn[columnIndex] === undefined) { itemsPerColumn[columnIndex] = []; }
let nextHour = itemsPerHour[currentHour][0].rowEnd;
itemsPerColumn[columnIndex].push(itemsPerHour[currentHour].shift());
currentHour = nextHour - 1;
itemsCount--;
}
if (currentHour === 18) {
currentHour = 8;
columnIndex++;
}
else currentHour++;
}
return itemsPerColumn;
}