Вот мой список дней
days_list: any[] = [
{
id: 0,
value: 'Monday'
},
{
id: 1,
value: 'Tuesday'
}, {
id: 2,
value: 'Wednesday'
}, {
id: 3,
value: 'Thursday'
}, {
id: 4,
value: 'Friday'
}, {
id: 5,
value: 'Saturday'
},
{
id: 6,
value: 'Sunday'
},
]
Вот мои часы работы
business_hours = { day_to: 2, time_to: "23:00", day_from: 5, time_from: "08:00" }
Я использую формат даты UTC. Я хочу знать, существует ли день с days_list
в соответствии с day_from
и day_to
Например, здесь day_from
равно 5, что является субботой, а day_to
равно 2, среда, поэтому требуемый массив:
["Saturday", "Sunday", "Monday". "Tuesday". "Wednesday"]
и то же самое для времени, если текущее время существует в time_from
и time_to
,
Мой код:
const activationDate = new Date();
const d_date = activationDate.getUTCDay() - 1;
console.info(d_date);
const B_from = this.getMin(this.business_hours.time_from);
const B_To = this.getMin(this.business_hours.time_to);
const min = activationDate.getUTCMinutes();
console.info(min)
const naan = activationDate.getUTCHours();
console.info(naan)
const utcTime = this.getUtcMin(naan, min);
for(let j = 0; j < this.business_hours.day_to; j++) {
for (let i = this.business_hours.day_from; i < this.days_list.length; i++) {
console.info(this.days_list[i]);
if (this.days_list[i].id === d_date) {
this.is_open = true;
console.info(this.days_list[i].value);
}
}
}
это не дает требуемых результатов.
Чтобы помочь ответить на такие вопросы, я бы порекомендовал перечислить пару тестовых случаев и предоставить как ожидаемые значения, так и значения, которые вы на самом деле видите.
Но я вижу пару вещей, которые могут вызвать проблемы в коде:
d_date
будет возвращать -1 для воскресенья, а не 6 (как ожидает days_list
)j
) на самом деле ничего не добавляет, потому что j
не используется внутри цикла. Следовательно, каждая итерация цикла будет иметь одинаковый эффект.i
) ищет только дни, которые появляются после day_from
в вашем массиве days_list
. Однако, согласно вашему примеру, дни с начала days_list
также могут совпадать, если значение day_from
больше, чем day_to
.Насколько я понимаю, вы хотели бы рассматривать свой массив как круговой , а затем нарезать его в соответствии с индексом «от» и «до», где индексы «от» и «до» обрабатываются как включительно.
Предположим, у вас есть такой массив строк:
console.info(dayArray);
// ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]
(в который вы можете легко превратить свою структуру, например:
const dayArray = days_list.reduce<string[]>((a, d) => (a[d.id] = d.value, a), []);
)
Затем вы можете написать срез кругового массива с включенной функцией конечных точек любым количеством способов. Вот один:
function circularArraySlice<T>(arr: T[], fromIndex: number, toIndex: number) {
return arr.map((_, i, a) => a[(i + fromIndex) % a.length]).
slice(0, ((arr.length + toIndex - fromIndex) % arr.length) + 1);
}
По сути, мы выходим из конца массива и возвращаемся к началу, используя модульную арифметику , как (почти) реализованную JS-оператором остатка (%). Посмотрим, работает ли это:
console.info(circularArraySlice(dayArray, 5, 2));
// ["Saturday", "Sunday", "Monday", "Tuesday", "Wednesday"]
console.info(circularArraySlice(dayArray, 2, 5));
// ["Wednesday", "Thursday", "Friday", "Saturday"]
Это, я думаю, то, что вы хотите. Могут быть крайние случаи, поэтому будьте осторожны.
Основываясь на ответе Рэнди Кэсберна (теперь удаленном), эту проблему можно решить с помощью метода filter javascript.
Однако вам нужно быть особенно осторожным при обработке отдельных случаев, когда to_date
стоит перед from_date
и наоборот.
Например:
const days_list = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'];
function getDays(business_hours) {
const days = days_list.filter((_, id) => {
if (business_hours.day_from <= business_hours.day_to) {
return (id >= business_hours.day_from && id <= business_hours.day_to);
} else {
return (id <= business_hours.day_to || id >= business_hours.day_from);
}
})
console.info(business_hours, days);
return days;
}
getDays({ day_from: 2, time_from: "23:00", day_to: 5, time_to: "08:00"});
getDays({ day_to: 2, time_to: "23:00", day_from: 5, time_from: "08:00"});
getDays({ day_from: 3, time_from: "23:00", day_to: 3, time_to: "08:00"});
Возможный дубликат Как циклически обращаться к массиву в JavaScript