質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.53%

  • JavaScript

    19920questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

コードを整理したい

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 605

innjera

score 114

以下の通りコードを書いていますが、完全に重複しています。
これを重複を排除し、綺麗に描きたいのですが、やり方がわからず、ご教示頂けますと助かります。

$(document).on('turbolinks:load', function() {
  $('.thumb li').click(function() {
    var class_name, num;
    class_name = $(this).attr('class');
    num = class_name.slice(5);
    $('.main li').hide();
    $('.item' + num).fadeIn();
  });
  var i, len, ref, results, tag;
  $('#magazine-tags').tagit({
    fieldName: 'adviser[magazine_list]',
    singleField: true
  });
  if (gon.magazine_tags != null){
    ref = gon.magazine_tags;
    results = [];
    for (i = 0, len = ref.length; i < len; i++) {
      tag = ref[i];
      results.push($('#magazine-tags').tagit('createTag', tag));
    }
    return results;
  }
  var i, len, ref, results, tag;
  $('#brand-tags').tagit({
    fieldName: 'adviser[brand_list]',
    singleField: true
  });
  if (gon.brand_tags != null){
    ref = gon.brand_tags;
    results = [];
    for (i = 0, len = ref.length; i < len; i++) {
      tag = ref[i];
      results.push($('#brand-tags').tagit('createTag', tag));
    }
    return results;
  }
});
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+2

コードでわかりやすく説明したつもりになったら、やたら長くなりました・・・

繰り返しを纏めます。

$(document).on('turbolinks:load', function() {

  $('.thumb li').click(function() {
    var class_name, num;
    class_name = $(this).attr('class');
    num = class_name.slice(5);
    $('.main li').hide();
    $('.item' + num).fadeIn();
  });

 // 関数にまとめる(名前は適切に変更のこと)
  var initializeMagazineTags = function(){
    var i, len, ref, results, tag;
    $('#magazine-tags').tagit({
      fieldName: 'adviser[magazine_list]',
      singleField: true
    });
    if (gon.magazine_tags != null){
      ref = gon.magazine_tags;
      results = [];
      for (i = 0, len = ref.length; i < len; i++) {
        tag = ref[i];
        results.push($('#magazine-tags').tagit('createTag', tag));
      }
      return results;
    }
  }; 

 // 関数にまとめる(名前は適切に変更のこと)
  var initializeBrandTags = function(){
    var i, len, ref, results, tag;

    $('#brand-tags').tagit({
      fieldName: 'adviser[brand_list]',
      singleField: true
    });

    if (gon.brand_tags != null){
      ref = gon.brand_tags;
      results = [];
      for (i = 0, len = ref.length; i < len; i++) {
        tag = ref[i];
        results.push($('#brand-tags').tagit('createTag', tag));
      }
      return results;
    }
  }; 

  // 実行
 var magazineTags = initializeMagazineTags();
  var brandTags = initializeBrandTags();
});

共通部分の差分を変数にして関数の先頭に変数として定義する。
動作が変わっていないか確認してください。

$(document).on('turbolinks:load', function() {

  $('.thumb li').click(function() {
    var class_name, num;
    class_name = $(this).attr('class');
    num = class_name.slice(5);
    $('.main li').hide();
    $('.item' + num).fadeIn();
  });

 // 関数にまとめる
  var initializeMagazineTags = function(){
    var tagSelector = '#magazine-tags';
    var fieldName = 'adviser[magazine_list]';
    var initialTags = gon.magazine_tags;

    var i, len, ref, results, tag;
    $(tagSelector).tagit({
      fieldName: fieldName,
      singleField: true
    });
    if (initialTags != null){
      ref = initialTags;
      results = [];
      for (i = 0, len = ref.length; i < len; i++) {
        tag = ref[i];
        results.push($(tagSelector).tagit('createTag', tag));
      }
      return results;
    }
  }; 

 // 関数にまとめる
  var initializeBrandTags = function(){
    var tagSelector = '#brand-tags';
    var fieldName = 'adviser[brand_list]';
    var initialTags = gon.brand_tags;

    var i, len, ref, results, tag;
    $(tagSelector).tagit({
      fieldName: fieldName,
      singleField: true
    });

    if (initialTags != null){
      ref = initialTags;
      results = [];
      for (i = 0, len = ref.length; i < len; i++) {
        tag = ref[i];
        results.push($(tagSelector).tagit('createTag', tag));
      }
      return results;
    }
  }; 

  // 実行
 var magazineTags = initializeMagazineTags();
  var brandTags = initializeBrandTags();
});

2つの関数の後半が同じ物になりました。
動作が変わっていないか確認してください。

$(document).on('turbolinks:load', function() {

  $('.thumb li').click(function() {
    var class_name, num;
    class_name = $(this).attr('class');
    num = class_name.slice(5);
    $('.main li').hide();
    $('.item' + num).fadeIn();
  });

  // 共通する部分を関数にまとめる
 var initializeTags = function(tagSelector, fieldName, initialTags){
    var i, len, ref, results, tag;
    $(tagSelector).tagit({
      fieldName: fieldName,
      singleField: true
    });
    if (initialTags != null){
      ref = initialTags;
      results = [];
      for (i = 0, len = ref.length; i < len; i++) {
        tag = ref[i];
        results.push($(tagSelector).tagit('createTag', tag));
      }
      return results;
    }
  };

 // 関数にまとめる
  var initializeMagazineTags = function(){
    var tagSelector = '#magazine-tags';
    var fieldName = 'adviser[magazine_list]';
    var initialTags = gon.magazine_tags;

    // 関数呼び出しに変更する
    return initializeTags(tagSelector, fieldName, initialTags);
  }; 

 // 関数にまとめる
  var initializeBrandTags = function(){
    var tagSelector = '#brand-tags';
    var fieldName = 'adviser[brand_list]';
    var initialTags = gon.brand_tags;

    // 関数呼び出しに変更する
    return initializeTags(tagSelector, fieldName, initialTags);
  }; 

  // 実行
 var magazineTags = initializeMagazineTags();
  var brandTags = initializeBrandTags();
});

冗長系はなくなったと思います。
動作が変わっていないか確認してください。

initializeMagazineTagsとinitializeBrandTagsはもはや何もしていません。
共通関数を直接呼び出すように変更します。

$(document).on('turbolinks:load', function() {

  $('.thumb li').click(function() {
    var class_name, num;
    class_name = $(this).attr('class');
    num = class_name.slice(5);
    $('.main li').hide();
    $('.item' + num).fadeIn();
  });

  // 共通する部分を関数にまとめる
 var initializeTags = function(tagSelector, fieldName, initialTags){
    var i, len, ref, results, tag;
    $(tagSelector).tagit({
      fieldName: fieldName,
      singleField: true
    });
    if (initialTags != null){
      ref = initialTags;
      results = [];
      for (i = 0, len = ref.length; i < len; i++) {
        tag = ref[i];
        results.push($(tagSelector).tagit('createTag', tag));
      }
      return results;
    }
  };

  // マガジンのタグを初期化する
 var magazineTags = initializeTags(
        '#magazine-tags', 'adviser[magazine_list]', gon.magazine_tags);
  // ブランドのタグを初期化する
  var brandTags = initializeTags(
        '#brand-tags', 'adviser[brand_list]', gon.brand_tags); 
});

共通関数を直接呼び出すように変更します。

冗長化を減らすというならこのような手順がよいと思います。

この先の改善点としては、initializeTagsは3つのことを行っていて、一つの関数にまとめていいのかという問題があります。つまり、保存先のfield設定、タグの初期値の設定、現在のタグの取得です。

保存先のタグのfiled設定に関してはもともと1行なので、共通の関数の中に隠す必要があるか疑問です。
現在のタグの取得も本来の目的外で分けたほうがわかりやすいかもしれません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/10 08:26

    とても丁寧なご説明ありがとう御座います!理解が深まりました!

    キャンセル

+1

jQuery日本語リファレンス
selector1, selector2, ..., selectorN
http://semooh.jp/jquery/api/selectors/multiple/

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/10 08:27

    参考サイトのご教示有難うございました。参考にさせて頂きます。

    キャンセル

同じタグがついた質問を見る

  • JavaScript

    19920questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。