Как узнать, существует ли текущее время в заданных временных интервалах, и найти, существует ли день между заданным массивом дней

Вот мой список дней

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);
      }
     }
    }

это не дает требуемых результатов.

Возможный дубликат Как циклически обращаться к массиву в JavaScript

jcalz 22.12.2020 03:01
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
4
1
78
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Чтобы помочь ответить на такие вопросы, я бы порекомендовал перечислить пару тестовых случаев и предоставить как ожидаемые значения, так и значения, которые вы на самом деле видите.

Но я вижу пару вещей, которые могут вызвать проблемы в коде:

  • Расчет 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"});

Другие вопросы по теме