【JavaScript switch文のcaseに変数を使う】


日付をランダムに選出して代入するプログラムを作ってます
/////////////////////////////////////
function test(){
days = Math.floor( Math.random()*30);
var newarray2 = new Array(31);
j=1;
for( i=0;i<=30;i++){//配列で01〜31日の配列を作る
newarray2[i] = j;
if( j <= 9){newarray2[i] = "0" + j; }//1桁の数字を0をつけ2桁にする
j++;
}
switch(days){
case 0: days = newarray[0]; break;
case 1: days = newarray[1]; break;
....
case 30: days = newarray[30]; break;
}
/////////////////////////////////////
switchでcaseを31個も使うのはださいので
forでまとめようと思ったのですが

switch(days){
for(i=0;i<=30;i++){
case i: days = newarray[i]; break;
}
}
alert(days);
}
試したのですが動きません...
また短くかけるソースならなんでもいいです

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2011/08/31 19:08:53
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:Jupiter2100 No.2

回答回数444ベストアンサー獲得回数74

ポイント40pt

こんな感じでどうでしょう。

//文字列を右側からn文字だけ取り出す
function right(str, n) {
    l = str.length;
    if (n > l)    n = l;
    return(str.substring(l - n, l));
}

function test() {
    days = Math.floor(Math.random() * 31) + 1;
    days = right("00" + days, 2);
    alert(days);
}
id:flandlescarlet

関数は動作して1桁の表示を2桁も動いて

欲しい動作そのままソース化していただいたのはありがたいのですが...

変数のスコープ上 days をグローバルとして呼び出したいのですが...

補足が足りてませんでしたが...

年、月、日でデータをランダムに格納しています

無論4月は30日までしか無いのでそのような場合に

変数をローカル変数でなく、グローバル変数として扱いたいのですが

ローカルで個別に決めた値をグローバルにはもってこれなくなっています

その場合はどういった処置を取ればよろしいでしょうか

2011/08/28 21:55:38

その他の回答2件)

id:taknt No.1

回答回数13539ベストアンサー獲得回数1198

ポイント20pt

switchも何もいらないと思います。

daysの値が 0だったら

days = newarray[0]; break;

をするということは


days = newarray[days]; break;

と同じことだと思いますが。


ちなみに

case i:

の箇所は 定数じゃないとダメかと思いますが。

id:flandlescarlet

一応例として出しました

case では定数しか使えないんですね

エラーコンソールでは単に関数が存在しませんとしか

出なかったためcaseに異常は無いと思ってました

2011/08/28 21:47:01
id:Jupiter2100 No.2

回答回数444ベストアンサー獲得回数74ここでベストアンサー

ポイント40pt

こんな感じでどうでしょう。

//文字列を右側からn文字だけ取り出す
function right(str, n) {
    l = str.length;
    if (n > l)    n = l;
    return(str.substring(l - n, l));
}

function test() {
    days = Math.floor(Math.random() * 31) + 1;
    days = right("00" + days, 2);
    alert(days);
}
id:flandlescarlet

関数は動作して1桁の表示を2桁も動いて

欲しい動作そのままソース化していただいたのはありがたいのですが...

変数のスコープ上 days をグローバルとして呼び出したいのですが...

補足が足りてませんでしたが...

年、月、日でデータをランダムに格納しています

無論4月は30日までしか無いのでそのような場合に

変数をローカル変数でなく、グローバル変数として扱いたいのですが

ローカルで個別に決めた値をグローバルにはもってこれなくなっています

その場合はどういった処置を取ればよろしいでしょうか

2011/08/28 21:55:38
id:language_and_engineering No.3

回答回数170ベストアンサー獲得回数63

ポイント40pt

コメント欄でじゅぴたー氏が述べた仕様で,関数を作りました。

学習用の参考リンクを含め,下記エントリにまとめておきました。


JavaScriptで,ランダムな日付情報を取得・表示する関数(うるう年などを加味し,期間の範囲も指定可能)

http://d.hatena.ne.jp/language_and_engineering/20110829/p1

id:flandlescarlet

ソース化していただきありがとうございます

無事に20YYMMDDの形でダイアログ表示確認しました

自分はこのランダム日付のソースを使って、はてなの

ランダムな日付の記事を見ようというものを考えていましたので

現在より過去そしてはてな建設時からという条件を使ってやろうと

考えていました

そのあたりはここまで作っていただいたので自分で考えます

2011/08/29 22:40:04
  • id:flandlescarlet
    補足が足りていませんでしたすいません

    じゅぴたーさんの日付関数取得の

    function{年の取得}
    function{月の取得}

    function right(str, n) {
    (中略)//days に 値を格納
    }

    function{月から日付の微調整、31,30,29,28等}

    alert("" + years + months + days + "");//年月日の表示
  • id:flandlescarlet
    この最後のダイアログと途中の微調整の部分で
    変数がdefindになってしまいます...
  • id:Jupiter2100
    >無論4月は30日までしか無いのでそのような場合に
    >変数をローカル変数でなく、グローバル変数として扱いたいのですが

    そうなると月の大小や閏日も加味しなければならないので、
    以下のように要件を変更しても構いませんか?
    その方が計算が簡単ですし、1つの関数で処理できます。

    西暦Y0年M0月D0日からY1年M1月D1日までの間の任意(ランダム)な日を
    YYYYMMDDの形で取り出す関数を作る

    関数の形
    function test(y0, m0, d0, y1, m1, d1) {
    ....
    return YYYYMMDD;
    }
  • id:flandlescarlet
    みなさん協力ありがとうございます
    switchでは定数しか使えないことが分かったり
    まだまだ仕様に勉学が必要そうです

    一応解決しましたが
    ユニークなアイデアが来るかもしれませんので
    少しあけておきます((来ないかもしれませんが
  • id:Jupiter2100
    language_and_engineeringさんのスクリプトは1970年1月1日以降(ブラウザによって若干違いがありますが)という制約が付きます。「はてな建設時から」ということであれば問題ないでしょう。
  • id:language_and_engineering
    >じゅぴたーさん

    IE4以降なら大丈夫ですね。

    ※上記エントリの「補足2:1970年1月1日以前の日付はどうなる?」を参照
  • id:flandlescarlet
    対応していない場合負の数を使うのですね
    勉強になります

    switchがifに比べ型判定が厳しいのも初めて知りました
    ifだと"1"も1も == これで通りますからね...

    今日の夜ぐらいにて締め切ります
  • id:flandlescarlet
    先に日付のコード提案をしていただいた
    じゅぴたーさんを選ばさせていただきます

    language_and_engineeringさんも
    コード化の方や詳しくダイアリーに言及いただき
    ありがとうございます

    先にcaseの値は定数でなければならないことを
    告げていただいたtakntさんもありがとうございました

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません