LoginSignup
0
1

More than 3 years have passed since last update.

イラレスクリプトでもmap/reduceを使いたい

Posted at

お仕事でIllustratorのスクリプトを触ることになった。
噂には聞いていたがかなり古い時代のJSしか動かないため=>とか.mapとかも使えない...。
他にも色々動かないけど

昨年末くらいからElixirばかり書いていて手続き的な書き方から遠ざかっていた人間としては配列をmap/reduceなしで触るのが精神的に堪えたので最初にEnumモジュール(と勝手によんでる)を作って書くことにした。

JSよくわからん... :thinking:

Elixirだと defmoduleでモジュールを作れるんだけど。。。
よくわからんがobject(Elixirのmap)に関数を割り当てることができるみたいなのでそれで

var Enum = {}
Enum.hoge = function() { ... }

こんな感じで書き始める

map

mapが無いと不安なのでまずはmapを実装します。
JSはLISPを参考にして開発されたって何かで見た気がするのでとりあえず再帰も使えるだろうと思って書いてみたらなんと再帰は使えない... :thinking:
悲しいけどブラウザで動く言語で再帰無限ループが起きるとやばいから再帰が使えないのは仕方ないのかと無理やり納得して不本意ながら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

を実装しました!!

これで気持ちよくなるべく副作用を出さないでイラレのデータを扱うことができました :tada:

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1