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

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

ただいまの
回答率

90.12%

条件分岐(if文)の使い方について教えてください。

受付中

回答 4

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 672

haruniku

score 49

はじめましてjavascript初心者です。
この場を借りてご質問させて頂きます。
例えば下記にAの処理とBの処理があります。
Aの処理が実行されない場合はBの処理を実行するようにしたいです。

まず、window.location.hrefでURLを取得します。
■A → https://teratail.com/questions/99172
Aの処理で99172を取得したい。

■B → https://teratail.com/questions/99172/*/
Bの処理で99172を取得したい。

※やりたいことはBのURL配下が一つ増えてもAと同じ値(99172)を取得したい。

ご教示の程、宜しくお願いします。

Aの処理
var aaa = window.location.href;
var bbb = aaa.split("/");
var ccc = bbb.length;
var ddd = bbb[ccc-1];
console.log(ddd);

Aの処理結果
99172
Bの処理
var aaa = window.location.href;
var bbb = aaa.split("/");
var ccc = bbb.length;
var ddd = bbb[ccc-2];
console.log(ddd);

Bの処理結果
questions


※Aの処理とBの処理をif文を使用して合体させたい。
実際に試してみたこと

var aaa = window.location.href;
var bbb = aaa.split("/");
var ccc = bbb.length;
var ddd = bbb[ccc-1];
if(aaa.indexOf("99172") > -1){
undefind;
}else{
var aaa = window.location.href;
var bbb = aaa.split("/");
var ccc = bbb.length;
var ddd = bbb[ccc-2];
}
console.log(ddd);
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • otn

    2017/11/05 07:48

    どういう条件の時に、「Aの処理が実行されない」のですか?

    キャンセル

  • haruniku

    2017/11/05 16:08 編集

    分かりづらくて訂正させて頂きました。
    やりたいことはBのURL配下が一つ増えてもAと同じ値を取得できる処理を実行したいです。
    その為には条件分岐を使用しないといけないのではないかと思い質問させて頂きました。

    キャンセル

  • takito

    2017/11/07 09:49 編集

    条件分岐のための「決め手」(取り出したい部分についての規則、ルール)を示してください。「必ず前から3番目」とか、「数値5ケタの書式」とか、「後ろから1番目か2番目のどちらか」とか、そういった情報があればよりよい回答が得られると思います。

    キャンセル

回答 4

+4

otn さんがおっしゃっているように条件文が謎ですが

普通に考えればこうでしょう

var aaa = window.location.href;
var bbb = aaa.split("/");
var ccc = bbb.length;
var ddd;

if (aaa.indexOf("99172") > -1)
{
    ddd = bbb[ccc-1];
}
else
{
    ddd = bbb[ccc-2];
}

console.log(ddd);

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/11/05 16:13

    分かりづらくて訂正させて頂きました。 やりたいことはBのURL配下が一つ増えてもAと同じ値を取得できる処理を実行したいです。 その為には条件分岐を使用しないといけないのではないかと思いました。

    キャンセル

+3

 要件の確認

「Aの処理」と「Bの処理」で何をしたいのかを具体化した方が良いのでは、と思います。
単純に考えると、ファイルパスからファイル名やディレクトリ名を抽出するコードでしょうか。

 DRY (Don't repeat yourself)

※Aの処理とBの処理をif文を使用して合体させたい。

要件から外れますが、Don't repeat yourselfの原則に従い、共通処理を関数化するとスマートなように思いました。

'use strict';
function getFilePathTokenByLastIndex (lastIndex /* [, location] */) {
  var _location = arguments.length < 1 ? location : arguments[1],
      tokens = _location.pathname.split('/');

  return tokens[tokens.length - Number(lastIndex) - 1]

}

console.log(getFilePathTokenByLastIndex(0, {pathname: '/questions/99172'}));  // "99172"
console.log(getFilePathTokenByLastIndex(1, {pathname: '/questions/99172'}));  // "questions"

第二引数を省略すれば、location.pathname からファイルパスを参照します。

 質問文の追記を読んで

■A → https://teratail.com/questions/99172
Aの処理で99172を取得したい。
  ■B → https://teratail.com/questions/99172/*/
Bの処理で99172を取得したい。

前方からindexを辿れば、インデックス値は固定になると思います。

function getFilePathTokenByIndex (index /* [, location] */) {
  return (arguments.length < 1 ? location : arguments[1]).pathname.slice(1).split('/')[Number(index)];

}

console.log(getFilePathTokenByIndex(1, {pathname: '/questions/99172'}));  // "99172"
console.log(getFilePathTokenByIndex(1, {pathname: '/questions/99172/1/'}));  // "99172"

"https://teratail.com/questions/99172" を保証するなら、いくつか対策はあります。

  1. location.host を見る
  2. /^\/questions\/(\d+)(?=$|/)/.exec(location.pathname) でマッチさせる

Re: kimurayu さん

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+1

番号の位置が決まっているならきめうちで採れば良いような。

var a = 'https://teratail.com/questions/99172/*/';
var b = a.split( '/questions/' )[ 1 ].split( '/' )[ 0 ];
console.log( b );

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

-1

そもそも条件分岐を使用する自体が間違いだということでしょうか?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • ただいまの回答率 90.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

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