公共の解決:リンクリストと列車


あなたはこれを知らないかもしれません、しかし、北極には完璧な電車生態系があります.
しかし、厳しい天候のため、これらの列車は非常に多くのメンテナンスを必要とします.
このパズルのために、我々は列車の構成を把握し、この組成物に特定のフィルタやアクションを追加する必要があります.
You can find the puzzle here.
入力としてリンクリストトレインオブジェクトを取得します.
リンクリストは基本的にAを持つオブジェクトを意味する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 , それで、機関車にアクセスすることによって、我々は電車全体を合成することができます.

解決策を考える
次の3つの作業が必要です.
  • 反復Wagonsの機能を完了し、電車を構築する
  • フィルタ機能を許可する
  • アクション機能を許可する
  • 以下のブートストラップ機能から始めます.
    const defaultFilterFn = () => true
    const defaultActionFn = wagon => console.log(`${wagon.emoji} ${wagon.name}`)
    
    export const iterateWagons = (start, actionFn, filterFn) => {}
    
    export const filterOldBreaks = wagon => {
        return true
    }
    
    反復Wagons関数とフィルタの古いbreak関数を入力しなければなりません.
    ここでの主な課題は、列車の各次の要素の次の列車の配列にワゴンを変換することです.
    それから、私たちがちょうど作成したこの配列の上で、フィルタとループにArrayメソッドを使わなければなりません.

    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.



    リンクリストの列車
    始めのオブジェクトを次の配列に変換しましょうnext 注文.
    私は、Aを使うことに決めましたwhile までループするnext プロパティが空です.
    const train = [start];
    while (start.next !== null) {
        start = start.next;
        train.push(start);
    }
    
    これは、機関車から始めて、列を列にセットします.
    次に、whileループはstart変数を次の要素に変更し、それを私たちの列にプッシュします.
    それがまだ空でないので、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.


    最初に注意すべきことは、Wagonsはブレイクサービスの次の日付表記を持っていることです.
    lastBreakRevision: '2021-02-15',
    
    新しい日付変数を設定してから1年を差し引くことから始めましょう.
    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 or