社内メーリングリストにポストしたら中々好評だったのでblogにまとめてみます。
E4Xにはフィルタ演算をする演算子として丸括弧があって、それを使うと、簡単に検索やフィルタリングが出来ます。
詳しくはこの辺りを参考に Core JavaScript 1.5 Guide:Processing XML with E4X
このこと自体は結構有名なので、知っている人や活用している人も多いかと思いますが、今回はこんな使い方もあるよというのを紹介してみます。
E4Xのフィルタ演算子の説明をしているのを見かけても、例はたいてい簡単な使い方しか載っていません。
var xmlList:XMLList = <>
<hoge>
<fuga id="1">aaa<fuga>
</hoge>
<hoge>
<fuga id="2">bbb<fuga>
</hoge>
<hoge>
<fuga id="3">ccc<fuga>
</hoge>
<hoge>
<fuga id="4">ddd<fuga>
</hoge>
<hoge>
<fuga id="5">eee<fuga>
</hoge>
</>;
trace(xmlList.(fuga == 'aaa'));
<>
<hoge>
<fuga id="1">aaa<fuga>
</hoge>
</>
trace(xmlList.(@id != 1));
<>
<hoge>
<fuga id="2">bbb<fuga>
</hoge>
<hoge>
<fuga id="3">ccc<fuga>
</hoge>
<hoge>
<fuga id="4">ddd<fuga>
</hoge>
<hoge>
<fuga id="5">eee<fuga>
</hoge>
</>
E4Xのフィルタ演算子は応用するともう少し色々出来るので紹介してみます。
例1 trace()出来る
xmlList.(trace(fuga)); aaa bbb ccc ddd eee
例2 正規表現でフィルタリング
var regexp:RegExp = new RegExp('aaa');
trace(xmlList.(String(fuga).match(regexp) != null));
<>
<hoge>
<fuga id="1">aaa<fuga>
</hoge>
</>
要するに丸括弧の中では、子供の名前がそのまま変数として使えるイメージで、フィルタしたい場合は、true/falseになるようにしてやれば良く、さらに、フィルタ結果を必ずしも使う必要がないので、例えば、イテレータみたいに使うことも出来てしまう、という感じです。
つまりこんな使い方も出来るのです。
var numbers:XMLList = <>
<number value="1"/>
<number value="2"/>
<number value="3"/>
<number value="4"/>
<number value="5"/>
<number value="6"/>
<number value="7"/>
<number value="8"/>
<number value="9"/>
<number value="10"/>
</>
numbers.(trace(@value));
1
2
3
4
5
6
7
8
9
10
JavaScriptに詳しい人なら、with文と同じと言えば良いですね。
with (xmlList)
{
trace(fuga)
}
xmlList.
(
trace(fuga)
);
これを先に書いたリンク先では
「式の手前のパスにマッチするノード(この場合は p 要素)は式が評価される前にスコープチェーンに追加されます。with 文 を使ってノードが指定されているかのような動作です。」
と説明しています。