공개 해결: 연결 목록과 기차

12897 단어 javascript
당신은 이것을 모를 수도 있지만 북극에는 완벽한 기차 생태계가 있습니다.

그러나 이 열차는 혹독한 날씨로 인해 상당한 유지 보수가 필요합니다.

이 퍼즐의 경우 기차 구성을 파악하고 이 구성에 특정 필터와 작업을 추가해야 합니다.

You can find the puzzle here.

입력으로 연결 목록 기차 개체를 얻습니다.
연결 목록은 기본적으로 다음 요소에 연결되는 next 속성이 있는 개체를 의미합니다.

예를 들어:

export const locomotive = {
    name: 'L-283',
    emoji: '🚂',
    isLocomotive: true,
    next: wagon1,
}
const wagon1 = {
    name: 'W-10582',
    emoji: '🚋',
    lastBreakRevision: '2021-02-15',
    next: wagon2,
}


보시다시피 기관차는 다음으로 wagon1 를 가지고 있고 그 대가로 wagon2 를 가지고 있으므로 기관차에 액세스하여 전체 기차를 합성할 수 있습니다.

솔루션에 대한 생각



다음 세 가지 작업이 필요합니다.
  • 마차 기능 반복을 완료하고 기차를 만드세요
  • 필터 기능이 발생하도록 허용
  • 작업 기능이 발생하도록 허용

  • 다음 부트스트랩 기능으로 시작합니다.

    const defaultFilterFn = () => true
    const defaultActionFn = wagon => console.log(`${wagon.emoji} ${wagon.name}`)
    
    export const iterateWagons = (start, actionFn, filterFn) => {}
    
    export const filterOldBreaks = wagon => {
        return true
    }
    


    iterate wagons 기능과 filter old breaks 기능을 채워야 합니다.

    여기서 주요 과제는 마차를 기차의 다음 각 요소를 따라가는 기차 배열로 변환하는 것입니다.

    그런 다음 방금 만든 이 배열을 필터링하고 반복하기 위해 배열 메서드를 사용해야 합니다.

    Note: It's been a while since I worked with Linked lists, so I'm pretty sure there are alternative ways of doing this assignment.



    JavaScript에서 연결된 목록 기차 만들기



    시작 개체를 next 순서를 따르는 배열로 변환해 보겠습니다.
    while 속성이 비어 있을 때까지 보기 위해 next 루프를 사용하기로 결정했습니다.

    const train = [start];
    while (start.next !== null) {
        start = start.next;
        train.push(start);
    }
    


    이것은 기관차로 시작하여 기차를 배열로 설정합니다.
    그런 다음, while 루프는 시작 변수를 다음 요소로 변경하고 이를 기차 배열로 푸시합니다.

    여전히 비어 있지 않으므로 while 루프를 다시 실행합니다.

    이제 이 train 배열에 마차의 전체 목록이 순서대로 있습니다!

    할당의 다음 부분은 각 마차에 특정 필터 기준을 추가할 수 있도록 하는 것입니다.

    이러한 기준 중 일부는 다음과 같을 수 있습니다.
  • 요소가 기관차인지 확인
  • 요소 브레이크 교체가 필요한지 확인하십시오

  • filter method 을 사용할 수 있습니다.
    그러나 필터가 지정되지 않은 경우 기본 필터를 사용해야 합니다. 매개변수에서 이것을 기본값으로 설정할 수 있습니다.

    export const iterateWagons = (
      start,
      actionFn,
      filterFn = defaultFilterFn
    ) => {
      const train = [start];
      while (start.next !== null) {
        start = start.next;
        train.push(start);
      }
    
      return train
        .filter((wagon) => filterFn(wagon));
    };
    


    그러면 제공된 필터와 일치하는 기차 요소만 반환되며 기본값은 모두 기본값입니다.

    이 기능에 대해 남은 마지막 부분은 작업입니다.
    우리는 마차마다 어떤 일이 일어나야 하는 조치를 전달해야 합니다.

    필터와 동일한 접근 방식을 사용할 수 있지만 forEach method 을 활용합니다.

    export const iterateWagons = (
      start,
      actionFn = defaultActionFn,
      filterFn = defaultFilterFn
    ) => {
      const train = [start];
      while (start.next !== null) {
        start = start.next;
        train.push(start);
      }
    
      return train
        .filter((wagon) => filterFn(wagon))
        .forEach((wagon) => actionFn(wagon));
    };
    


    이제 우리가 해야 할 일은 오래된 휴식 시간에 대한 필터를 만드는 것뿐입니다.

    고장난 시스템은 오늘부터 최소 1년 동안 서비스되지 않으면 오래된 것입니다.

    Note: again multiple ways to do this.



    가장 먼저 주목해야 할 점은 마차에는 휴식 시간에 대해 다음과 같은 날짜 표기가 있다는 것입니다.

    lastBreakRevision: '2021-02-15',
    


    새 날짜 변수를 설정하고 여기서 연도를 빼서 시작하겠습니다.

    new Date(new Date().setFullYear(new Date().getFullYear() - 1))
    // When running this on 10 December 2021 we get:
    // 2020-12-10T05:10:51.846Z
    


    거의 다 왔으니 T05:10:51.846Z 부분만 제거하면 됩니다.

    이 작업을 수행하기 위해 T에서 분할하고 첫 번째 부분만 반환할 계획입니다.
    이것은 이제 날짜 개체이기 때문에 작동하지 않으며 문자열이어야 합니다.

    그것이 .toISOString()가 작동하는 곳입니다.

    export const filterOldBreaks = (wagon) => {
      return (
        new Date(new Date().setFullYear(new Date().getFullYear() - 1))
          .toISOString()
          .split('T')[0] > wagon.lastBreakRevision
      );
    };
    


    그리고 완전한 중단 확인 기능이 있습니다!

    테스트를 실행하고 우리가 어떻게 했는지 봅시다:



    다른 사람들이 이 퍼즐을 어떻게 풀었는지 정말 궁금합니다. 알려주세요 👏

    읽어주셔서 감사합니다. 연결해 보겠습니다!



    제 블로그를 읽어주셔서 감사합니다. 내 이메일 뉴스레터를 구독하고 Facebook 또는

    좋은 웹페이지 즐겨찾기