JavascriptのArrayでeach,map,eachWithObject

Javascriptを触る機会があったのでちょっと試してみた。郷に入っては郷に従えというけれどJavascriptの流儀やAPIがわからなかったので、とりあえずArrayにeachとmap、eachWithObjectをくっつけてみた。

// [1,2,3].eachWithIndex(function(n,i) { console.log("#" + i + " = " + n)})
Array.prototype.eachWithIndex = function(func) {
  var length = this.length;
  for (var i = 0; i < length; i++) {
    func.apply(this, [this[i], i]);
  }
  return this;
}

// [1,2,3].each(function(n) { console.log(n) })
Array.prototype.each = function(func) {
  return this.eachWithIndex(function(x,i) {
    func.apply(this, [x]);
  })
}

// [1,2,3].map(function(n) { return n * 2; });
Array.prototype.map = function(func) {
  var result = new Array();
  this.eachWithIndex(function(x,i) {
    result.push(func.apply(this, [x]));
  });
  return result;
}

// [1,2,3].eachWithObject({}, function(s, n) { s[n.toString] = n * 100 });
Array.prototype.eachWithObject = function(obj, func) {
  this.eachWithIndex(function(x,i) {
    func.apply(this, [obj, x]);
  });
  return obj;
}

func.applyは関数オブジェクトfuncの処理を走らせるもので、Proc#callみたいなもの。第1引数にはfunc内でthisが参照するオブジェクトを、第2引数にはfuncの引数を配列で与えてやる。

引数は参照渡しされる。

JavascriptのリファレンスはMozillaのとこが詳しい。ただしJavascriptの実行エンジンの種類やバージョンで差異があるので要注意。ここらへんの一覧ってないのかな?

Javascriptオブジェクト指向言語のなかでもプロトタイプベース(もしくはインスタンスベース)と呼ばれるものに区分されるらしい。間違ってるだろうけど、インスタンスメソッドを生やして行くような感覚がある。