index.js 580 B

12345678910111213141516171819202122232425
  1. /**
  2. * Array#filter.
  3. *
  4. * @param {Array} arr
  5. * @param {Function} fn
  6. * @param {Object=} self
  7. * @return {Array}
  8. * @throw TypeError
  9. */
  10. module.exports = function (arr, fn, self) {
  11. if (arr.filter) return arr.filter(fn, self);
  12. if (void 0 === arr || null === arr) throw new TypeError;
  13. if ('function' != typeof fn) throw new TypeError;
  14. var ret = [];
  15. for (var i = 0; i < arr.length; i++) {
  16. if (!hasOwn.call(arr, i)) continue;
  17. var val = arr[i];
  18. if (fn.call(self, val, i, arr)) ret.push(val);
  19. }
  20. return ret;
  21. };
  22. var hasOwn = Object.prototype.hasOwnProperty;