ikemonn's blog

技術ネタをちょこちょこと

【Underscore.js】_.compactを読んだ

jashkenas/underscore_.compactを読んだ。

概要

_.compact(array) 

配列の中のfalsyな値(false, null, 0, "", undefined, NaN)を除いて返す。

var list = [0, null, undefined, 1, 2, "null", "", NaN];
var x = _.compact(list);
console.log(x); // [1, 2, "null"]

ソースコード

  _.compact = function(array) {
    return _.filter(array, _.identity);
  };

 _.identity = function(value) {
    return value;
  };

_.filter = _.select = function(obj, predicate, context) {
    var results = [];
    predicate = cb(predicate, context);
    _.each(obj, function(value, index, list) {
      if (predicate(value, index, list)) results.push(value);
    });
    return results;
  };

.identityは引数をそのまま返すだけの関数。 それを.filterの引数に与えて実行することで、_.filter内の下記のif文でfalsyは弾かれて結果に入らなくなる。

// predicate = _.identity
if (predicate(value, index, list)) results.push(value);

ただ値を返すだけの_.identityが、他の関数と組み合わさって便利になってるのを見て良いなと思った。

参考

jashkenas/underscore