06. Type Ahead


プロジェクトの概要


  • 検索ウィンドウに一定の単語を入力と、リアルタイムで検索してUIに反映する
  • .

    コード作成順序

  • fetch API、基本データ受信後アレイ
  • に入れる
  • クエリの対応するデータのみを抽出する関数(正規表現を使用)
  • を作成します.
  • 検索結果をHTMLコード(.interHTML)
  • に挿入する関数を作成します.
  • 検索ウィンドウ(input)における単語置換イベントを検出することにより、上記2、3回の関数のeventlistener貼り付け
  • を実行する.
  • 、innerHTML挿入を追加する場合は、3つの場所に「」、「ビット挿入」の関数(正規表現で置換方法)
  • を追加できます.

    学んだこと


    - Fetch API


    :データの非同期送受信のための最新のAPI、Promiseオブジェクトを返します.
    : .json()メソッドは、応答ストリームを取得し、ストリームが完了するまでストリームを読み出し、bodyテキストからJSONに変換して解析するpromiseを返す.
    :基本コード
    fetch('http://example.com/movies.json')
     .then(response => response.json())
     .then(data => console.log(data));
    https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch

    - spread syntax('...')


    :arrayまたはobjectのelementを関数のパラメータとして使用する既存のapply()を置き換えます.
    :arratまたはobjectの要素の追加、削除またはマージを容易に実現
    https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Spread_syntax

    -regExp(正規表現)


    :文字列内の特定の文字の組み合わせに対応するモードです.
    :JavaScriptでは正規表現もオブジェクト
    :正規表現関連メソッド(match、replaceなど)を使用するには、まず新しいRegExpオブジェクトを関連メソッドのパラメータとして使用する必要があります.
    https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/%EC%A0%95%EA%B7%9C%EC%8B%9D

    最終コード

        <script>
          const endpoint =
            'https://gist.githubusercontent.com/Miserlou/c5cd8364bf9b2420bb29/raw/2bf258763cdddd704f8ffd3ea9a3e81d25e2c6f6/cities.json';
    
          const cities = [];
          fetch(endpoint)
            .then((blob) => blob.json())
            .then((data) => {
              cities.push(...data);
              console.log(cities);
            });
    
          // cities에서 검색어와 매치되는 데이터만 선별
          function findMatches(wordToMatch, cities) {
            return cities.filter((place) => {
       
              const regex = new RegExp(wordToMatch, 'gi');
              return place.city.match(regex) || place.state.match(regex);
            });
          }
         function numberWithCommas(x) {
            //세자리 숫자마다 콤마 찍기 위함
            return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
          }
    
          function displayMatches() {
            const matchArray = findMatches(this.value, cities);
            const html = matchArray
              .map((place) => {
                const regex = new RegExp(this.value, 'gi');
                const cityName = place.city.replace(
                  regex,
                  `<span class="hl">${this.value}</span>`
                );
                const stateName = place.state.replace(
                  regex,
                  `<span class="hl">${this.value}</span>`
                );
                return `
            <li>
              <span class="name">${cityName}, ${stateName}</span>
              <span class="population">${numberWithCommas(place.population)}</span>
            </li>
          `;
              })
              .join('');
            suggestions.innerHTML = html;
          }
    
          const searchInput = document.querySelector('.search');
          const suggestions = document.querySelector('.suggestions');
    
          searchInput.addEventListener('change', displayMatches);
          searchInput.addEventListener('keyup', displayMatches);
        </script>

    に感銘を与える

  • は最も難しいプロジェクトです
  • 正規表現の作成は容易ではありません(Googleで3桁のカンマのような通常のフォーマットを検索すると、簡単に見つかります)
  • のテキスト検索などの関連機能を利用するには、正規表現(まず、新しい正規表現を作成し、変数に挿入し、使用する方法のパラメータ(regex))
  • を熟知する必要がある.