お仕事でIllustratorのスクリプトを触ることになった。
噂には聞いていたがかなり古い時代のJSしか動かないため=>とか.mapとかも使えない...。
他にも色々動かないけど
昨年末くらいからElixirばかり書いていて手続き的な書き方から遠ざかっていた人間としては配列をmap/reduceなしで触るのが精神的に堪えたので最初にEnumモジュール(と勝手によんでる)を作って書くことにした。
JSよくわからん...
Elixirだと defmodule
でモジュールを作れるんだけど。。。
よくわからんがobject(Elixirのmap)に関数を割り当てることができるみたいなのでそれで
var Enum = {}
Enum.hoge = function() { ... }
こんな感じで書き始める
map
mapが無いと不安なのでまずはmapを実装します。
JSはLISPを参考にして開発されたって何かで見た気がするのでとりあえず再帰も使えるだろうと思って書いてみたらなんと再帰は使えない...
悲しいけどブラウザで動く言語で再帰無限ループが起きるとやばいから再帰が使えないのは仕方ないのかと無理やり納得して不本意ながらforを使って実装する。
mapが実装できたら他のところでforを書かなくて良いのだからまぁ...
Enum.map = function(arr, f) {
var res = [];
for (var i = 0; i < arr.length; i++) {
res.push(f(arr[i]));
}
return res
}
var result = Enum.map([1,2,3], function(i) {
return i * 2;
});
// イラレスクリプトではconsole.logは使えないんだけど..
console.log(result);
[2,4,6]
これでヨシ!
reduce
mapがあるならreduceも必要だ!
この2つがそろえばfilterやreject、anyやincludeなんかも実装できる!
早速書いていく
Enum.reduce = function(arr, acm, f) {
var res = acm;
for (var i = 0; i < arr.length; i++) {
res = f(arr[i], res);
}
return res
}
var result = Enum.reduce([1,2,3], 0, function(i, acm) {
return acm + i;
});
console.log(result);
これでヨシ!
他に書いたもの
reduceがあればたいていなんでも実装できるのでこれ以上は書かないんですが実装したものとしては
- each
- eachSlice
- compact
- filter
- reject
- include
- groupBy
を実装しました!!
これで気持ちよくなるべく副作用を出さないでイラレのデータを扱うことができました