>source

내 요일 목록입니다

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_fromday_to

예를 들어 여기 day_from 토요일은 5이고 day_to 2 수요일이므로 필수 배열은 다음과 같습니다. ["Saturday", "Sunday", "Monday". "Tuesday". "Wednesday"] 현재 시간이있는 경우 시간에 대해서도 동일합니다. time_fromtime_to ,

내 코드는 다음과 같습니다.

  const activationDate = new Date();
    const d_date = activationDate.getUTCDay() - 1;
    console.log(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.log(min)
    const naan = activationDate.getUTCHours();
    console.log(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.log(this.days_list[i]);
      if (this.days_list[i].id === d_date) {
        this.is_open = true;
        console.log(this.days_list[i].value);
      }
     }
    }

필요한 결과를 제공하지 않습니다.


  • 답변 # 1

    내 이해는 어레이를 다음과 같이 취급하고 싶다는 것입니다.회보, 그런 다음 "from"및 "to"인덱스에 따라 슬라이스합니다. 여기서 "from"및 "to"인덱스는 모두 포함으로 처리됩니다.

    다음과 같은 문자열 배열이 있다고 가정 해 보겠습니다.

    console.log(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.log(circularArraySlice(dayArray, 5, 2));
    // ["Saturday", "Sunday", "Monday", "Tuesday", "Wednesday"] 
    console.log(circularArraySlice(dayArray, 2, 5));
    // ["Wednesday", "Thursday", "Friday", "Saturday"]
    
    

    이것은 당신이 원하는 것입니다. 가장자리 케이스가있을 수 있으니 조심하세요.

    코드에 대한 플레이 그라운드 링크

  • 답변 # 2

    이와 같은 질문에 답하기 위해 몇 가지 테스트 케이스를 나열하고 예상 값과 실제로보고있는 값을 모두 제공하는 것이 좋습니다.

    그러나 코드에서 문제를 일으킬 수있는 몇 가지 사항을 볼 수 있습니다.

    계산 d_date 6이 아닌 일요일에 -1을 반환합니다. days_list 기대하고 있습니다)

    외부 루프 (한 설정 j )는 여기에 많은 것을 추가하지 않습니다. j 루프 내에서 사용되지 않습니다. 따라서 루프의 각 반복은 동일한 효과를 갖습니다.

    내부 루프 (1 개 설정 i )는 다음 날짜 만 검색합니다. day_from 당신의 days_list 정렬. 그러나 예를 들어 시작일로부터 며칠 days_list 일치하는 경우 day_from 값이보다 큼 day_to .

  • 답변 # 3

    Randy Casburn의 (현재 삭제 된) 답변을 기반으로 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.log(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"});
    
    

관련 자료

  • 이전 ethereum - thegraphcom 새 계약을 추적하기 위해 프로그래밍 방식으로 데이터 소스를 업데이트하는 방법은 무엇입니까?
  • 다음 python - PyQT QThread는 스레드 실행 순서를 따릅니다 (대기)