![]() | tech note |
| 自分をリファクタリング中。 |
COMオブジェクトのコレクションを順番に処理する場合、VBScriptではFor Each ~ in ~で処理できるので、JScriptでもfor ~ inでいけると思いきやNG。
JScriptからはEnumeratorを使ってアクセスするようだ。
var fsobj = new ActiveXObject("Scripting.FileSystemObject");
var folder = fsobj.GetFolder("c:\\tmp");
var e = new Enumerator(folder.Files);
for(; !e.atEnd(); e.moveNext()) {
var file = e.item();
・・・
}
Enumeratorにコレクションを与えてnewして、atEnd()とmoveNext()を使ったループの中でFileオブジェクトをitem()で取得しつつ、ぐるぐる回すのがオーソドックスなやり方みたい。
でも、for(; !e.atEnd(); e.moveNext()) ~っていうのがカッコわるくて気に入らない。
そこで、Enumeratorのprototypeにeachを追加したらスマートに書けるのでは?と思い、書いてみたのが以下のコード。
通常の処理の中ではeachメソッドでぐるぐる回せる。//Enumeratorにeachメソッドを追加
Enumerator.prototype.each = function(func) {
this.moveFirst();
for(; !this.atEnd(); this.moveNext()) {
func(this.item());
}
}
//通常の処理
var fsobj = new ActiveXObject("Scripting.FileSystemObject");
var folder = fsobj.GetFolder(fm.dir.value);
var e = new Enumerator(folder.Files);
//eachでループ
e.each(
function(file){document.write(file.Name);}
);