常日頃からPCの前に居て、Flashを立ち上げてる生活をしてると、日常のちょっとした計算とかもActionScriptでやってしまおうかという気になります。
気になりますというかそうなってます。
今回は「変数Stringの中から同じ文字は除外するScript」を考えてみました。
スクリプトはこちら
var str:String = "人民のぉ〜人民によるぅ〜〜人民のためのぉ〜";
function myMap(item:*, index:int, array:Array):String {
var l:int=index-1;
for (var i:int = 0; i < l; i++) {
if (array[i]==item) {
return "";
}
}
return item;
}
var a:Array=str.split("");
var uniqString:String=a.map(myMap).join("");
trace(uniqString);
順番に説明していきます。
まず1行目。
var str:String = "人民のぉ〜人民によるぅ〜〜人民のためのぉ〜";
もともとの文章です。
この文章から同じ文字は消したいと考えます。
そのためにはどうすればいいのかを次のように考えます。
//----モワモワ〜モワモワモワ〜〜start
- 全部の文字をループして、過去の文字と同じ文字があれば消せばいいんだ。
- 全部の文字をループさせて、その中でさらに過去の文字もループさせて、ほいでcharAtで抜き出して一致してれば消せばいいんだ。
- めんどくせ〜
- もっと楽な方法ないかな〜
- あ、確かAS3の配列の関数で「全部繰り返して引数を渡す」っていう関数があったぞ
- それ使ってみよう
- 作ってみたけど普通にcharAtしたのと比べてダサくね?
- それ以前に重複する文字列抜き出すって場面、そんなになくね? ←今ここ
//----モワモワ〜モワモワモワ〜〜end
まあ3〜11行目。
function myMap(item:*, index:int, array:Array):String {
var l:int=index-1;
for (var i:int = 0; i < l; i++) {
if (array[i]==item) {
return "";
}
}
return item;
}
配列の中で過去に出てきた文字を全部ループさせといて、今の文字と同じなら消す。
そうでないなら今の文字を戻してやる。
という関数を書いています。
※「今の文字」っちゅうのはあとからmap関数の説明で出てきます。
13行目。
var a:Array=str.split("");
重複を消したい文章を一旦配列にしてみます。
14行目。
var uniqString:String=a.map(myMap).join("");
出ましたァーーーッ!
map();
配列の便利関数としてmapって関数に実行したい処理を書いてやると最初から最後まで処理を行って結果を返してくれます。
そいつをおもむろにjoin()。
女陰って…
なんか…
いやらしい響きですね…ぐへへへへ。
ちなみに「実行したい処理」ってやつは3行目〜11行目のmyMapって関数になってます。
最終的にはuniqStringは女陰、じゃなかったjoinでStringに変換されているので、この変数が重複した文字を取り除いたStringということになります。
アルゴリズムとしてこういうのってダサいのかどうなのかはわからないですが、やりたいことを実装するためにどうすればいいのかを考えるのは楽しいですね。