二足のわらじ

〜プログラミングとSEOの勉強をはじめたミーハー26歳のメモ帳〜

【備忘録】IFの冗長な文章を三項演算子で省略

現状

・LINEのようなチャットアプリを作成中
・メッセージを非同期通信で保管・表示させたい
・メッセージの「SEND」ボタンを押すと非同期通信が発火
・文字のみ、画像のみ、文字と画像のそれぞれのメッセージを表示する

以下のようなjavascriptを書いたところ
buildHTML()の動作のIF分が冗長すぎるとのレビューがあったので
三項演算子で修正

$(function() {
 function buildHTML(message){
    if (message.image.url) {
      if (message.body) {
        var html = `<div class="message">
                      <div class="upper-message">
                        <div class="upper-message__user-name">
                        ${message.name}
                        </div>
                        <div class="upper-message__date">
                        ${message.created_at}
                        </div>
                      </div>
                      <div class="lower-meesage">
                        <p class="lower-message__content">
                        ${message.body}
                        </p>
                        <img class = "lower-message__image" src = "${message.image.url}" >
                      </div>
                    </div>`
      } else {
        var html =  `<div class="message">
                      <div class="upper-message">
                        <div class="upper-message__user-name">
                        ${message.name}
                        </div>
                        <div class="upper-message__date">
                        ${message.created_at}
                        </div>
                      </div>
                      <div class="lower-meesage">
                        <img class = "lower-message__image" src = "${message.image.url}" >
                      </div>
                    </div>`
      }
    } else {
      var html = `<div class="message">
                    <div class="upper-message">
                      <div class="upper-message__user-name">
                      ${message.name}
                      </div>
                      <div class="upper-message__date">
                      ${message.created_at}
                      </div>
                    </div>
                    <div class="lower-meesage">
                      <p class="lower-message__content">
                      ${message.body}
                      </p>
                    </div>
                  </div>`
    }
    return html
  }


  $('.messages').animate({
    scrollTop: $('.messages')[0].scrollHeight
  });

  $("#new_message").on("submit", function(e) {
    e.preventDefault();
    var formData = new FormData($(this).get(0));
    var url = $(this).attr('action');
    
    $.ajax({
      url : url,
      type : 'POST',
      processData: false,
      data : formData,
      dataType : "json",
      processData : false,
      contentType : false
    })
    .done(function(data){
      var html = buildHTML(data);
      $('.messages').append(html);
      $('.messages').animate({ scrollTop: $('.messages')[0].scrollHeight});
      $("#new_message")[0].reset();
      $('.form__submit').prop('disabled', false);

    })
    .fail(function(){
      alert("メッセージ送信に失敗しました");
      $("#new_message")[0].reset();
      $('.form__submit').prop('disabled', false);
    })
  });
});

改善

buildHTMLの部分のIF文を三項演算子で修正

  function buildHTML(message){
    var message_body = message.body? message.body : "" ;
    var message_image = message.image.url? message.image.url : "" ;

    var html = `<div class="message">
                  <div class="upper-message">
                    <div class="upper-message__user-name">
                    ${message.name}
                    </div>
                    <div class="upper-message__date">
                    ${message.created_at}
                    </div>
                  </div>
                  <div class="lower-meesage">
                    <p class="lower-message__content">
                    ${message_body}
                    </p>
                    <img class = "lower-message__image" src = "${message_image}" >
                  </div>
                </div>`
    return html
  }

条件式 ? Trueの処理 : Falseの処理

【メモ①】
参考演算子の条件式は、
message.body?(メッセージという変数のbodyというカラムに値がありますか?)
というような書き方でも動く。
参考記事では、比較演算子やtrue falseで条件式を
書くサイトが多かったが上記のような条件式でも動いた!


【メモ②】
最初は、三項演算子のtrueの記述部分で${ }をつけていたためエラーに。
${ }は、変数で呼び出したあとの記述に記載しておけばOK

  function buildHTML(message){
    var message_body = message.body? <b>${message.body}</b> : "" ;
    var message_image = message.image.url? <b>${message.image.url} </b>: "" ;

【参考記事】
【JavaScript入門】条件(三項)演算子の使い方と活用例まとめ! | 侍エンジニア塾ブログ(Samurai Blog) - プログラミング入門者向けサイト