javascriptでArrayにeach()を実装する
wsh(jscript)で使っていた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のように扱って実現できるね。