LoginSignup
7
7

More than 5 years have passed since last update.

underscore.jsを読む#1 each

Last updated at Posted at 2014-04-30

underscore.jsを少しずつ読んでいきたいと思います。※バージョンは1.6.0

第一回はeach。

each.js
var each = _.each = _.forEach = function(obj, iterator, context) {
  if (obj == null) return obj;
  if (nativeForEach && obj.forEach === nativeForEach) {
    obj.forEach(iterator, context);
  } else if (obj.length === +obj.length) {
    for (var i = 0, length = obj.length; i < length; i++) {
      if (iterator.call(context, obj[i], i, obj) === breaker) return;
    }
  } else {
    var keys = _.keys(obj);
    for (var i = 0, length = keys.length; i < length; i++) {
      if (iterator.call(context, obj[keys[i]], keys[i], obj) === breaker) return;
    }
  }
  return obj;
};

まず、ネイティブでforEachが存在する場合はそれを使います。そうでない場合は、lengthが数値として定義されている場合にはfor文で各要素に対してiteratorを実行し、そうでない場合はオブジェクトのkeyを取得してfor文でiteratorを実行していきます。

breakerによる早期終了はネイティブのforEachにはない機能でユーザは使うことができませんが、_.someなどundersocre.js内の早期に終了することができるfor文を停止させるために使われています。

良い例は思いつきませんが、contextを指定することでiterator内のthisを指定できます。

underscoreをforkしてコメントを追加していくことにしました。
リファレンスも合わせて翻訳しています

7
7
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
7
7