findAppropriateSlotsToShift(tasksToShift, freeSlots) { let sortedTasksByPriority = _.reverse(tasksToShift); let sortedFreeSlotsByPriority = _.reverse(freeSlots); let hoursToFree = this.estimation - this.totalAvailHours; let counter = 0; _.forEach(sortedTasksByPriority, (value, key) => { let slotDuration = value.slots.futureSlots[counter].duration; let freePlaces = sortedFreeSlotsByPriority[counter]; if (hoursToFree <= 0) { return false; } _.forEach(Object.keys(freePlaces), (freeDay, index) => { if (hoursToFree <= 0) { return false; } _.forEach(freePlaces[freeDay], (freeSlot, i) => { if (freeSlot.duration >= slotDuration) { value.slots.futureSlots[counter].start = freeSlot.start; value.slots.futureSlots[counter].end = new Date(new Date(freeSlot.start).setHours(new Date(freeSlot.start).getHours() + value.slots.futureSlots[counter].duration)).toISOString(); hoursToFree -= slotDuration; freeSlot.start = value.slots.futureSlots[counter].end; freeSlot.duration = freeSlot.duration - value.slots.futureSlots[counter].duration; sortedFreeSlotsByPriority = this._freeSlotsUpdate(freeDay, freePlaces[freeDay], sortedFreeSlotsByPriority); console.log(this.Slots); this.Slots.update(value.slots.futureSlots[counter]); return false; } }); }); counter = (key === sortedTasksByPriority.length) ? counter + 1 : counter; }); }