JavaSriptでeachしてみた
最近ずっとRuby
を書いていて、久しぶりにJavaScript
を書くとまず;
を忘れる。
今回はこんなことをしてて焦った。
[code.high.num]
var arr = new Array();
arr = ["ruby", "perl", "javascript", "jquery"];
arr.each(function(value) {
console.log(value);
});
// Uncaught TypeError: Object ruby,perl,javascript,jquery has no method 'each'
for
で書けるけど、Rubyになれるとfor
を使うのに気が進まない…。いつの間にか…。
調べてみるとjQuery
をrequireじゃなくて…src
するとeach
が使えるみたい。
[code.high.num]
var arr = new Array();
arr = ["ruby", "perl", "javascript", "jquery"];
$.each(arr, function(index, value) {
console.log(index + ":" + value);
});
// 0:ruby
// 1:perl
// 2:javascript
// 3:jquery
あとjQueryにstrip
的なのがあったからメモ。
[code.high.num]
var str = " \nRuby \n\t";
str.trim(); // => "Ruby"
JavaScriptはRubyとまた違ったオブジェクト指向でやりやすかったり、やりにくかったり。プロトタイプとかがまたややこしいと思ったり。オブジェクト作るのがめんどくさかったり。
たりたり。
追記(2013/03/19)
それ、forEach
メソッドでできるよ。(というか断然こっちのほうが良い・・・)
[code.num.high]
var arr = ["ruby", "perl", "javascript", "jquery"];
arr.forEach(function(value, index) {
console.log(index + ":" + value);
});
というかこっちのほうがRubyに近いですね。
jQueryと違ってvalueとindexが逆になっているので注意です。また、forEach
はArray
のインスタンスですのでオブジェクトには使えません。オブジェクトのときはjQueryを使うか、for each…in
文を使いましょう。
[code.num.high]
for each (var value in obj) {
value.method(value.key);
}
Chromeは未実装なのか動きません。for each…in
文はjavascript1.8
からです。
他にもObject
のプロトタイプをいじるという手もありそうですが、それはあまり良くないでのしたくないですね…。
オブジェクトの場合は素直にjQuery使ったほうが良さそうです。
また、forEach
はこんな引数も持ちます。
[code.num.high]
arr.forEach(function(value, index) {
this.method(index, value);
}, obj)
こんな感じでforEach
文のなかで参照できるオブジェクトを指定することが可能。未指定の場合はundefined
です。
コンストラクタ内で使うときはthis
の指すものが変わると厄介なのでobj
にthis
を指定してあげれば全く問題ないですね。
ちなみにjQueryのeach
でのthis
では、インスタンスからeach
で参照されたものをオブジェクトとして返します。(インスタンスって言っていいのかな...)
jQuery.each() jQuery API Documentation
The value can also be accessed through the this keyword, but Javascript will always wrap the this value as an Object even if it is a simple string or number value.
[code.num.high]
var arr = ["ruby", "perl", "javascript", "jquery"];
$.each(arr, function() {
console.log(this);
});
// String {1: "r", 2: "u", 3: "b", 4: "y"}
// String {1: "p", 2: "e", 3: "r", 4: "l"}
// ...
blog comments powered by Disqus