Массив только с одним обновленным выходом с использованием react

#arrays #reactjs #mongodb #timeslots

#массивы #reactjs #mongodb #временные интервалы

Вопрос:

Я разрабатываю приложение MERN, в котором у меня есть участники с их временем и датой, временной интервал представляет собой массив, который может содержать более одного слота для одного сотрудника или участника, поэтому всякий раз, когда пользователь нажимает на средство выбора даты после нажатия на определенный персонал, пользователь должен получить временной интервал этогослот в зависимости от того, что находится в их слоте, проблема, с которой я сталкиваюсь, заключается в том, что если у персонала, например, более одного занятого слота (два слота), который становится массивом объектов, временной интервал отображается дважды, и каждый из них обновляется отдельно в зависимости от данных. Вот код:

Итак, сначала я получаю данные из массива и передаю их функции:

 {members.timeSlot.map((slot, is) =>
    <div key={is} >
       {counter(slot.slot_date ,slot.slot_start_time, slot.slot_end_time)}
    </div>
)}

 

Функция над ним:

  let counter = (storedDate, startTime, endTime) => {

        var times = ['09:00 AM', '10:00 AM', '11:00 AM', '12:00 PM','01:00 PM', '02:00 PM', '03:00 PM', '04:00 PM', '05:00 PM', '06:00 PM'];
        var rows = [];
      

           var sDate = new Date(storedDate); 
           let storedDay = sDate.getDate();
           let storedMonth = (sDate.getMonth()   1 );
           let storedYear = sDate.getFullYear();

           let selectedDate = date  
           let selectedDay = selectedDate.getDate(); // 11
           let selectedMonth = (selectedDate.getMonth()   1);
           let selectedYear =  selectedDate.getFullYear();
        
        for (var j = 0; j < times.length; j  ) {
            let count = j   9;
            if(storedDay === selectedDay amp;amp; storedMonth === selectedMonth ) {

            if(count >= startTime amp;amp; count <= endTime ) {
                 continue;
            } else {
                rows.push(
                    <>
                         <label style={{backgroundColor:'pink', color:'blue'}}><input type="radio" value={count} key={j} style={{position:'relative'}} name="schedule-weekly-option" onClick={()=> setTimes(count)} />amp;nbsp;{times[j]} amp;nbsp;</label>
                    </>
                  );
               }
        } else  {
                rows.push(
                <>
                     <label style={{backgroundColor:'blue', color:'pink'}} ><input type="radio" value={count} key={j} style={{position:'relative'}} name="schedule-weekly-option" onClick={()=> setTimes(count)} />amp;nbsp;{times[j]} amp;nbsp;</label>
                </>
              );
        }
        } return <div >{rows}</div>;
       
    }
 

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

введите описание изображения здесь

Должен ли я обновить массив? и какой лучший способ это сделать? Я использую реагирующие хуки.

Я был бы признателен за вашу помощь!

Спасибо.

Комментарии:

1. Каким должен быть ожидаемый результат, если существует более одного временного интервала? Ваш вопрос немного неясен.

2. Он должен показывать время с 9 до 6 часов вечера только один раз. и он должен быть обновлен, если я изменю указатель даты на дату, когда у персонала есть занятые слоты, и время занятости будет удалено.

3. у вас есть 2 оператора IF, которые перекрывают друг друга. Попробуйте исправить свою логику if-else.

4. Это members.timeSlot массив с более чем 1 элементом в нем? Array.prototype.map отображает взаимно однозначный массив, поэтому, если есть два временных интервала, массив, возвращаемый из сопоставления, также будет иметь два элемента. Возможно, вам нужно определить, какой элемент временного интервала из массива вы хотите отобразить первым, поскольку похоже, что вы визуализировали оба слота с «одинаковыми» переключателями и метками.

5. Да, я думаю, что он появляется снова в зависимости от длины массива временных интервалов, это то, что я пытаюсь исправить.