javascriptでArrayにeach()を実装する

wshjscript)で使っていたArrayのeach実装を紹介するよ。

rubyのeachみたいなのが欲しいこんなの

array = ["ok", "ng", "ok", "ng"];
array.each{|item|
  puts item;
}

jsだからこんな使い方が出来るeachが欲しい

var array = ["ok", "ng", "ok", "ng"];
array.each(function (item, i) {
  alert(item + ':' + i);  // ok:0, ng:1, ok:2, ng:3
});

おまけでmethod chainもできたらなお良いかも?

var list = array.each(function (item, i) {
  if (item == 'ok') return item;
}).each(function (item, i) {
  alert(item + ':' + i);  // ok:0, ok:1
  return item;
});
alert(list.length);  // 2

という訳で実装してみた。

簡単。

Array.prototype.each = function (fn) {
  var len = this.length;
  var result = new Array();
  for (var i=0; i < len; i++) {
    var ret = fn.apply(this, [this[i], i]);
    if (ret != null) result.push(ret);
  }
  return result; // method chain
}

そうかそうか。rubyのblockみたいなことをしたい場合はfunctionを引数に渡してblockのように扱って実現できるね。