$.array-methods.js 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. // 0 -> Array#forEach
  2. // 1 -> Array#map
  3. // 2 -> Array#filter
  4. // 3 -> Array#some
  5. // 4 -> Array#every
  6. // 5 -> Array#find
  7. // 6 -> Array#findIndex
  8. var ctx = require('./$.ctx')
  9. , IObject = require('./$.iobject')
  10. , toObject = require('./$.to-object')
  11. , toLength = require('./$.to-length')
  12. , asc = require('./$.array-species-create');
  13. module.exports = function(TYPE){
  14. var IS_MAP = TYPE == 1
  15. , IS_FILTER = TYPE == 2
  16. , IS_SOME = TYPE == 3
  17. , IS_EVERY = TYPE == 4
  18. , IS_FIND_INDEX = TYPE == 6
  19. , NO_HOLES = TYPE == 5 || IS_FIND_INDEX;
  20. return function($this, callbackfn, that){
  21. var O = toObject($this)
  22. , self = IObject(O)
  23. , f = ctx(callbackfn, that, 3)
  24. , length = toLength(self.length)
  25. , index = 0
  26. , result = IS_MAP ? asc($this, length) : IS_FILTER ? asc($this, 0) : undefined
  27. , val, res;
  28. for(;length > index; index++)if(NO_HOLES || index in self){
  29. val = self[index];
  30. res = f(val, index, O);
  31. if(TYPE){
  32. if(IS_MAP)result[index] = res; // map
  33. else if(res)switch(TYPE){
  34. case 3: return true; // some
  35. case 5: return val; // find
  36. case 6: return index; // findIndex
  37. case 2: result.push(val); // filter
  38. } else if(IS_EVERY)return false; // every
  39. }
  40. }
  41. return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result;
  42. };
  43. };