アーカイブ

‘JavaScript’ タグのついている投稿

PHPの配列関数のまとめ

2012 年 1 月 21 日 コメントはありません

以前、JavaScriptの配列に関するメソッドについてまとめましたが、同じようにPHPの配列関数についてまとめてみました。
PHPの配列関数はたくさんあるので、とりあえず基本だけです。

関数 返り値 配列への影響 対応するJavaScriptのメソッド
array_shift($a) 最初の要素を返す。 最初の要素が削除される。 a.shift()
array_unshift($a,要素) 挿入後の配列の長さを返す。 先頭に要素が挿入される。 a.unshift(要素)
array_pop($a) 最後の要素を返す。 最後の要素が削除される。 a.pop()
array_push($a,要素) 挿入後の配列の長さを返す。 最後に要素が挿入される。 a.push(要素)
array_slice($a,$i,$j) 0から数えてi番目からj個の要素を配列として返す。 なし。 a.slice(i,j)
array_splice($a,$i,$j,$b); なし。 0から数えてi番目からj個の要素を削除し別の配列に置き換えた配列になる。 a.splice(i,j)
array_splice($a,count($a),0,$b) なし。 配列の後に別の配列を追加した配列になる。 a.concat(配列)
カテゴリー: PHP タグ: ,

JavaScriptでゼロ埋め

2011 年 12 月 22 日 コメントはありません

1桁の数「5」に「0」を追加して2桁「05」で表示するような手法を「ゼロ埋め」や「パディング」などと言います。
Excelには「TEXT」、VBAには「Format」、PHPには「sprintf」という関数がありますが、JavaScriptには見当たりません。
これを作ってみます。 続きを読む…

カテゴリー: JavaScript タグ: ,

JavaScriptで配列をコピーする

2011 年 8 月 16 日 コメントはありません

JavaScriptで配列をコピーするときは次のような注意が必要です。

a=[10,20,30];
b=a;

配列変数aを配列変数bにコピーしています。
これで配列変数bをaの代わりに使うことができます。

次にpopを使ってaの最後の要素をクリアします。

a.pop();

この場合、bには何も影響しないように思われますが、実行結果は次のようになります。

a=[10,20]
b=[10,20]

bもaと同じく最後の要素がクリアされます。
つまり「b=a」とすると各要素がコピーされるのではなく「bはaを参照する」ということになるのです。
したがって各要素をコピーするためには次のようにします。

a=[10,20,30];
for(i=0;i<a.length;i++){
    b[i]=a[i];
}
a.pop();

実行結果は次の通り。

a=[10,20]
b=[10,20,30]

意図通り、aだけが処理されました。

なお次のような簡単な方法もあります。
sliceを使うと配列を部分的に抜き出すことができます。
第1引数にセットした位置から第2引数にセットした位置の前まで抜き出します。
第1引数に「0」をセットし、第2引数を省略すると、最初から最後までを抜き出しますので、配列の各要素をコピーするのと同じ効果があります。

a=[10,20,30];
b=a.slice(0);
a.pop();
カテゴリー: JavaScript タグ: , ,

switchとifで速いのはどっち?(JavaScript)

2011 年 6 月 16 日 コメントはありません

前に、VBAで「SelectCaseとIfで速いのはどっち?」というのを調べてみましたが、今度はJavaScriptで同じことをしてみました。なお、SelectCaseはswitchに置き換えます。
サンプルコードは省略しますが、同様の関数を作り、10000回繰り返したときの実行時間を測りました。

サンプル 時間
配列変数 0.5124秒
switch 0.0688秒
if(単純) 0.2594秒
if(終了) 0.0359秒
if(場合分け) 0.0359秒

面白いのはifの場合分けを使った場合の効果に違いが見られなかったことです。

カテゴリー: JavaScript タグ: ,

東日本大地震からの経過年月日を表示する

2011 年 6 月 11 日 コメントはありません

東日本大地震が起きたのが3月11日。
ちょうど3か月が経過しました。
これを自動的にカウントするJavaScriptのコードを書いてみました。

document.write(count_ymd());
function count_ymd() {
    var fdy = 2011,
        fdm = 3 - 1,
        fdd = 11;
    var td = new Date();
    var tdy = td.getFullYear(),
        tdm = td.getMonth(),
        tdd = td.getDate();
    var dy = tdy - fdy;
    var dm = tdm - fdm;
    var dd = tdd - fdd;
    if (dd < 0) {
        dd = (new Date(tdy, tdm, 0)).getDate() - fdd + tdd;
        dm--;
    }
    if (dm < 0) {
        dm = dm + 12;
        dy = dy - 1;
    }
    return ((dy > 0 ? dy + "年" : "") + (dm + "か月") + (dd > 0 ? dd + "日" : "ちょうど"));
}
カテゴリー: JavaScript タグ: , ,

JavaScriptの日付オブジェクトが認識する形式

2011 年 5 月 24 日 コメントはありません

JavaScriptの日付オブジェクトは、年、月、日とバラバラにセットして使いますが、日付を表す文字列をセットしても日付として認識します。

document.write(new Date("15 June 2008"));

これを実行すると次の通り表示されます。

Sun Jun 15 00:00:00 UTC+0900 2008

では、どのような日付文字列ならば正しく処理されるのでしょうか。 続きを読む…

カテゴリー: JavaScript タグ: , ,

「同じ文字が2個並んだ文字列」の正規表現

2011 年 5 月 23 日 コメントはありません

「book」の「oo」のように文字の繰り返しを見付ける正規表現について調べました。

JavaScriptの場合

まず/.{2}/という表現を思い付きますが、これでは「同じ文字が2個並んだ文字列」になりません。単に「文字が2個並んだ文字列」です。1個目と2個目の文字が異なってもよいからです。
そこで次のようにします。

str="book";
ret=str.match(/(.)\1/g);

「oo」が返されます(正確にはret[0]として)。
JavaScriptの正規表現では「\1」を使うと括弧に挟まれた部分を取得できます。
/(.)/とすると任意の1文字が取得でき、\1に格納されます。
/(.)\1/とすると/\1\1/のように「同じ文字が2個並んだ文字列」を探すことになります。

秀丸の場合

検索文字列として「(.)\1」を指定します。
もちろん正規表現にチェックを入れます。
もし「同じ文字が2個以上並んだ文字列」を検索するならば「(.)\1+」とするとよいでしょう。

カテゴリー: JavaScript タグ: , ,

JavaScriptのmatchの返り値

2011 年 5 月 23 日 コメントはありません

JavaScriptのmatchは正規表現に合致した文字列を配列で返します。
「g」を付けない場合と「g」を付ける場合で内容が変わります。

gを付けない場合 gを付ける場合
0個目 合致した部分全体
1個目 1個目の括弧で括られた部分
2個目 2個目の括弧で括られた部分
0個目 最初に合致した部分全体
1個目 2番目に合致した部分全体

gを付けない場合のサンプル

str="xayxbyxcy";
ret=str.match(/(x.)y/);

ret[0]=”xay”
ret[1]=”xa”

「x□y」という文字列を探しています。
gがないので一つ見つけたら終わりです。
返り値の0個目は合致した部分全体です。「xay」になります。
返り値の1個目は合致した部分のうち括弧に挟まれた部分です。「(xa)y」と見て「xa」になります。

gを付ける場合のサンプル

str="xayxbyxcy";
ret=str.match(/(x.)y/g);

ret[0]=”xay”
ret[1]=”xby”
ret[2]=”xcy”

上のサンプルと同じく「x□y」という文字列を探しています。
gがあるので合致する文字列をすべて見付けます。
返り値の0個目は最初に合致した文字列です。
返り値の1個目は2番目に合致した文字列です。
返り値の2個目は3番目に合致した文字列です。
括弧に挟まれた部分を返すようなことはありません。

カテゴリー: JavaScript タグ: ,

長音を含む文字列を辞書順でソート

2011 年 5 月 7 日 コメントはありません

辞書の言葉の並び順はアイウエオ順ですが、「ー」という伸ばす音、長音があるときは、その前の音によって判断されます。
その前の音がア段ならば「ア」、イ段ならば「イ」となります。
例えば「ワード」ならば「ワアド」、「キー」ならば「キイ」として並び順が決まります。

ワア≫ワー≫ワアド≫ワード≫ワイ

となります。 続きを読む…

カテゴリー: JavaScript タグ: ,

JSONの\uXXXXをデコード

2011 年 4 月 16 日 コメントはありません

TwitterAPIなどを使い、JSON形式でデータを取得した場合、文字列が次のようになっている場合があります。

\u4eca\u671d\u306f

初めて見ると「文字化けか」と思ってしまうかもしれませんが、これはJSONのルール通りなんだそうです。
この「\uXXXX」形式は「Unicode文字エスケープシーケンス」、「unicode escape sequence」などと呼ぶそうです。
2.4.1 Unicode 文字エスケープ シーケンス (C#)
Unicodeにおける文字番号を4桁の16進数に置き換えて、頭に「\u」を付けます。
これをJavaScriptを使って人間が読める形にする方法(デコード)を調べました。

単純な方法

簡単なのは次のようにJavaScriptでページに書く方法です。

document.write("\u4eca\u671d\u306f");

これで次のように表示されます。

今朝は

関数を使う方法

「json_str_decode」という関数を作ってみました。
このケースでは「\」が(JavaScriptの)エスケープシーケンスに該当してしまうので「\\」のようにしないと正しく認識しません。

document.write(json_str_decode("\\u4eca\\u671d\\u306f"));
function json_str_decode(str){
    arrs=str.match(/\\u.{4}/g);
    var t="";
    for(i=0;i<arrs.length;i++){
        t+=String.fromCharCode(arrs[i].replace("\\u","0x"));
    }
    return(t);
}

次のようにテキストエリアなどに貼り付けて使う場合には「\\」とする必要がありません。

<textarea id="ta">\u4eca\u671d\u306f</textarea>
<div id="mydiv"></div>
var a=document.getElementById("ta").value;
document.write(json_str_decode(a));
カテゴリー: JavaScript タグ: ,